如何解决这段代码是如何工作的?俯仰和偏航
我最近在寻找如何为游戏创建简单的机器人,有两种方法可以做到这一点 1 是使用 atan2 和 sin 计算俯仰和偏航,例如
但是还有另一种方法人们如何计算它,我的问题是它是如何工作的?
代码:
void CalcAngle(float *src,float *dst,float *angles)
{
double delta[3] = {(src[0] - dst[0]),(src[1] - dst[1]),(src[2] - dst[2])};
int x = 0;
int y = 1;
int z = 2;
float hyp = delta[x] * delta[x] + delta[y] * delta[y];
angles[0] = asinf(delta[z] / hyp) * 180 / pi;
angles[1] = atanf(delta[y] / delta[x]) * 180 / pi;
if(angles[0] > 0.0)
{
angles[1] += 180;
}
}
以及我的想象人们是如何做到这一点的
如果有人知道这段代码发生了什么,你能向我解释它是如何计算有效值的。例如,它无法计算第三和第二象限角,那么它甚至对其他人如何工作?以及为什么他们要计算三角形的相邻而不是斜边的对边?我不会问这个代码是不是单一案例,但我已经在很多案例中看到了。
解决方法
代码似乎确实是错误的。您应该使用 atan2
表示俯仰,使用 double hyp = sqrt(delta[x] * delta[x] + delta[y] * delta[y]);
angles[0] = atan(delta[z] / hyp) * 180 / pi; // Pitch
angles[1] = atan2(delta[y] / delta[x]) * 180 / pi; // Yaw
if(angles[1] < 0.0)
angles[1] += 180;
表示偏航。
<template>
<div>
<transition name="toast">
<div id="slide" class="slide-modal" v-if="statuses.length">
<div class="clear-notifications" @click='clearAllNotifications()'>Clear all notifications</div>
<div v-for="status in statuses" :key="status.id" class="status-div">
<div>{{ status.text }}</div>
<div @click="closeStatus(status)"><span class="-x10-cross"></span></div>
</div>
</div>
</transition>
</div>
</template>
<script lang="ts">
import { defineComponent,ref,computed,watch,onMounted } from "vue";
import { useStore } from "../model/DataStore";
export default defineComponent({
setup() {
const store = useStore();
const statuses = ref([]);
const statusMessage = computed(() => store.state.statusMessage);
function addStatus(newMessage) {
statuses.value.push({
id: statuses.value.length + 1,text: newMessage
})
}
watch(statusMessage,(newValue: string,oldValue: string) => {
addStatus(statusMessage.value);
})
onMounted(() => {
window.addEventListener("scroll",function (e) {
let vertical_position = 0;
vertical_position = pageYOffset;
if(document.getElementById("slide")){
document.getElementById('slide').style.bottom = -(vertical_position) + 'px';
}
});
})
return {
store,statuses,addStatus
};
},methods: {
clearAllNotifications() {
this.statuses = []
},closeStatus(elm: any) {
const index = this.statuses.map((status) => status.id).indexOf(elm.id);
this.statuses.splice(index,1);
}
}
})
</script>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。