四分之一角

时间:2010-12-14 01:45:56

标签: java algorithm math geometry trigonometry

好吧,这就是我这样做的方式:

float xrot = 0;
float yrot = 0;
float zrot = 0;

Quaternion q = new Quaternion().fromRotationMatrix(player.model.getRotation());
if (q.getW() > 1) {
    q.normalizeLocal();
}

float angle = (float) (2 * Math.acos(q.getW()));
double s = Math.sqrt(1-q.getW()*q.getW());

// test to avoid divide by zero, s is always positive due to sqrt
// if s close to zero then direction of axis not important
if (s < 0.001) {
    // if it is important that axis is normalised then replace with x=1; y=z=0;
    xrot = q.getXf(); 
    yrot = q.getYf();
    zrot = q.getZf();
    // z = q.getZ();
} else {
    xrot = (float) (q.getXf() / s); // normalise axis
    yrot = (float) (q.getYf() / s);
    zrot = (float) (q.getZf() / s);
}

但是当我尝试使用它时它似乎不起作用:

player.model.addTranslation(xrot * player.speed, 0, zrot * player.speed);

AddTranslation使用3个数字来移动我的模型而不是许多空格(x,y,z),但是我给它上面的数字它不会使模型沿着它旋转的方向移动(在XZ平面上) )

为什么这不起作用?

编辑:新代码,虽然它现在大约45度。

Vector3 move = new Vector3();
move = player.model.getRotation().applyPost(new Vector3(1,0,0), move);
move.multiplyLocal(-player.speed);
player.model.addTranslation(move);

1 个答案:

答案 0 :(得分:1)

xrotyrotzrot定义四元数指定的旋转轴。我认为您不想在addTranslation()电话中使用它们......一般来说,这与动作方向没有任何关系。

我的意思是:你的三维物体 - 让我们说它是一架飞机 - 它的原始坐标会有一个优选的运动方向 系统。因此,如果原始方向的原点具有质心,那么 螺旋桨沿+ X轴某处,飞机想沿+ X方向飞行。

现在介绍一些将飞机旋转到其他方向的坐标转换。该旋转由旋转矩阵描述,或等效地由a表示 四元数。旋转后飞机想要以哪种方式移动?

你可以找到 通过在+ X方向取一个单位向量:(1.0,0.0,0.0),然后应用 旋转矩阵或四元数到该向量,将其转换为新坐标 系统。 (然后按照上面的速度按速度进行缩放。)X,Y和Z分量 变换后的缩放矢量给出了沿每个轴的所需增量运动。那个变换后的矢量通常将成为四元数的旋转轴,我认为这可能是你的问题。