繁体   English   中英

3D向量的整体角度

[英]Global angle of 3d vectors

我有3个向量,分别代表方向和右上。

我需要将它们转换为XYZ角(3个浮点),以便可以与glRotatef()一起使用

请帮忙

[编辑]

它无法正确渲染。 你能看一下这里是否有什么公然吗: pastebin.com/f6683492d

我认为您的意思是“向上,向右和向前”,因为向下是向上的对立面,不会依赖任何新信息。
您的问题不是很清楚,但我想您的意思是您想对由您描述的向量定义的新坐标基进行转换。 如果这些向量是正交的(它们之间具有90度),那么您就不必费心计算角度并使用glRotate()。 相反,您可以将新碱基的向量直接用作转换。

假设您拥有的向量是A(a1,a2,a3)-向上,B(b1,b2,b3)-右,C(c1,c2,c3)-向前。 首先,如果并非完全正交,则需要确保它们变为正交,并且可能会有一些叉积。 其次,您需要确保它们的长度为1。现在创建以下矩阵:

a1 b1 c1 0
a2 b2 c2 0
a3 b3 c3 0
0  0  0  1

这是旋转矩阵,它将使您从单位基准转到由A,B,C定义的基准。有了此矩阵,您要做的就是使用glMultMatrix()完成。 如果第一次尝试不起作用,转置矩阵可能会解决问题。


编辑再次检查后,矩阵的正确顺序应如下所示:对于向量A(ax,ay,az),B(bx,by,bz),C(cx,cy,cz)

ax ay az 0
bx by bz 0
cx cy cz 0
0  0  0  1

这是以上答案的转置。 另外,我建议您首先尝试看看是否无需翻译即可使用。 然后,您可以通过简单地将其添加到矩阵中来添加翻译,如下所示:

ax     ay     az     0
bx     by     bz     0
cx     cy     cz     0
pos.x  pos.y  pos.z  1
x = acos( dp3( nrm( up ), new vec3( 0, 1, 0 ) ) );
y = acos( dp3( nrm( dir ), new vec3( 0, 0, 1 ) ) );
z = acos( dp3( nrm( right ), new vec3( 1, 0, 0 ) ) );

其中dp3是3分量点积,nrm归一化3分量向量,而vec3构造一个所定义的向量。

这会给你你有vectr 默认坐标基准之间的角度。

编辑:当然,如上所述,您很可能已经具有可以应用的基础矩阵。 也非常容易进行正态化。 实际上,我无法想到您需要做我上面所做的事情的时间..但是..嘿...这是您所要求的;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM