我试图围绕另一个对象旋转对象,同时保持自己的旋转。我完成了每个对象的旋转,我只是不确定如何围绕另一个对象旋转对象。例如,我有一个名为Planets [Sun,Mercury]的数组。我想让太阳静止不动,让汞在一个轴上围绕太阳旋转。
目前我有太阳和水银自行旋转这是通过以下方式完成的: 首先将degress改为弧度。
function degToRad(degrees)
{
return degrees * Math.PI / 180;
}
然后在我的drawScene()中旋转矩阵:
mat4.rotate(mvMatrix, degToRad(rCube), [0, 1, 0]);
然后最后当我为场景设置动画时,我使用以下方式移动对象:
var lastTime = 0;
function animate() {
var timeNow = new Date().getTime();
if (lastTime != 0)
{
var elapsed = timeNow - lastTime;
rCube -= (75 * elapsed) / 1000.0;
}
lastTime = timeNow;
}
无论如何我可以将原点传递给
mat4.rotate(mvMatrix, degToRad(rCube), [0, 1, 0]);
使它像:
mat4.rotate(mvMatrix, ObjectToRotateAround, degToRad(rCube), [0, 1, 0]);
我觉得好像我没有解释我很好的代码。如果你想看看它可以在这里找到: https://copy.com/iIXsTtziJaJztzbe
答案 0 :(得分:0)
我认为你需要做一系列矩阵运算,并且矩阵运算的顺序很重要。
在这种情况下你可能想要的是首先将Mercury转换为Sun的位置,然后进行旋转,然后反转第一次转换。我自己还没有实现分层对象,所以我不想让你迷惑。但是这里是我实现轨道摄像机的代码,偏航功能使摄像机围绕目标点旋转,你可能会发现它很有用:
yaw: function(radian){
this.q = quat.axisAngle(this.q, this.GLOBALUP, radian);
vec3.rotateByQuat(this.dir, this.dir, this.q);
vec3.cross(this.side,this.GLOBALUP,this.dir);
vec3.normalize(this.side,this.side);
this.pos[0] = this.target[0] - this.dir[0] * this.dist;
this.pos[1] = this.target[1] - this.dir[1] * this.dist;
this.pos[2] = this.target[2] - this.dir[2] * this.dist;
}
其中this.dir是一个标准化矢量,总是给出从Camera到目标的方向,this.dist是摄像机和目标之间的距离。您可以使用矩阵旋转而不是四元数旋转。
编辑:只需添加方向即可通过取两个对象的位置来计算,然后将其标准化。