webgl围绕一个轴上的另一个对象旋转对象

时间:2014-11-23 01:10:56

标签: javascript rotation webgl

我试图围绕另一个对象旋转对象,同时保持自己的旋转。我完成了每个对象的旋转,我只是不确定如何围绕另一个对象旋转对象。例如,我有一个名为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

1 个答案:

答案 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是摄像机和目标之间的距离。您可以使用矩阵旋转而不是四元数旋转。

编辑:只需添加方向即可通过取两个对象的位置来计算,然后将其标准化。