Math 在具有原点的点上应用旋转矩阵失败
从这个答案;我已经编写了一些代码,可以围绕原点旋转一个点。原点位于0,0,0 我的旋转不是Math 在具有原点的点上应用旋转矩阵失败,math,matrix,rotation,rotational-matrices,Math,Matrix,Rotation,Rotational Matrices,从这个答案;我已经编写了一些代码,可以围绕原点旋转一个点。原点位于0,0,0 我的旋转不是偏航俯仰滚转,而是xrotyrot和zrot,它们是度(0-360)。绕X轴旋转会导致对象前后倾斜,绕Z轴旋转会导致对象旋转,就像对象的偏航一样 我想我在翻译价值观的过程中弄错了,但我似乎不明白为什么 当围绕每个分离角度旋转点时(保持其他2个为0度),每次旋转都会给出正确的解决方案 综合起来,当在X和Z或Y和Z上旋转时,结果是好的。当围绕X和Y旋转时,结果是不正确的 var cosa = cos(-
偏航
俯仰
滚转
,而是xrot
yrot
和zrot
,它们是度(0-360)。绕X轴旋转会导致对象前后倾斜,绕Z轴旋转会导致对象旋转,就像对象的偏航一样
我想我在翻译价值观的过程中弄错了,但我似乎不明白为什么
当围绕每个分离角度旋转点时(保持其他2个为0度),每次旋转都会给出正确的解决方案
综合起来,当在X和Z或Y和Z上旋转时,结果是好的。当围绕X和Y旋转时,结果是不正确的
var cosa = cos(-degtorad(zrot));
var sina = sin(-degtorad(zrot));
var cosb = cos(-degtorad(yrot));
var sinb = sin(-degtorad(yrot));
var cosc = cos(-degtorad(xrot));
var sinc = sin(-degtorad(xrot));
var Axx = cosa*cosb;
var Axy = cosa*sinb*sinc - sina*cosc;
var Axz = cosa*sinb*cosc + sina*sinc;
var Ayx = sina*cosb;
var Ayy = sina*sinb*sinc + cosa*cosc;
var Ayz = sina*sinb*cosc - cosa*sinc;
var Azx = -sinb;
var Azy = cosb*sinc;
var Azz = cosb*cosc;
var px = Axx*x + Axy*y + Axz*z;
var py = Ayx*x + Ayy*y + Ayz*z;
var pz = Azx*x + Azy*y + Azz*z;
degtorad
基本上是返回输入*pi/180
我觉得计算的顺序有问题——因为单独的旋转会给出正确的结果,仅仅是这三种方式的组合就不会
我知道这一点,因为我正在使用zrot、yrot和xrot值旋转三维模型,并在相同的三维空间中绘制点-在大多数情况下,点与模型对齐,但不在X和Y或X、Y和Z上旋转
结果视频:(通过此代码计算的橱柜角落上有2个点)您必须记住,旋转通常不是可交换的,即围绕X旋转,然后在Y中旋转一次,不会产生与以相反顺序执行的相同旋转相同的结果。对于Euler角度,更改一个角度可以有效地旋转其他两个角度的轴。使用矩阵+既定惯例(如欧拉角的偏航-俯仰-滚转变量)比重新发明车轮更好。谢谢!问题是我一直在使用GameMaker内置的旋转模型功能;我用它来提交顶点缓冲区。然后我需要这段代码在不同部分生成的点来进行冲突检查。@meowgoesthedog正在查看函数列表。。。我实际上看到了
矩阵\u变换\u顶点
——它正是我想要的方式。谢谢:)