我有3个向量,向右和向前表示方向。
我需要将它们转换为XYZ角度(3个浮点数),这样我就可以使用glRotatef()
请帮忙
[编辑]
它无法正常渲染。你能看出这里有什么明显的东西:pastebin.com/f6683492d
答案 0 :(得分:6)
我认为你的意思是“向上,向右和向前”,因为向下是与向上相反,并且不会依赖于任何新信息。
你的问题不是很清楚,但我认为你的意思是你要创建一个由你描述的向量定义的新坐标基础的转换。如果这些向量是正交的(它们之间有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
答案 1 :(得分:0)
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与 默认坐标基础之间的角度。
编辑:当然,正如上面所指出的,你很可能已经有了一个可以申请的基础矩阵。也非常容易正交。实际上我想不出你需要做我上面做过的事情的时间......但是......嘿......你要的是什么;)