[英]How to rotate model using 3 vectors (forward, right, up)
我有使用3个欧拉角(aRotX,aRotY,aRotZ)在position(aX,aY,aZ)上显示model的代码:
var m = mat4.create();
mat4.identity(m);
mat4.translate(m, [aX, aY, aZ]);
mat4.rotateX(m, aRotX);
mat4.rotateY(m, aRotY);
mat4.rotateZ(m, aRotZ);
这可行,但我想使用它的前/右/上向量显示 model。 怎么做?
如果您有 3 个向量表示对象 3 轴的 alignment 和一个坐标,您可以从这 4 个向量手动构建一个 position 矩阵。
轴向量 {x,y,z} 的长度应表示沿该轴的比例。 如果对向量进行归一化,比例将为 1。将向量相乘以缩放 object。
所以 3 轴作为xAxis
, yAxis
, zAxis
和coord
在世界空间
4 x 4 矩阵作为数组
const matrix4 = new Float32Array([
xAxis.x, xAxis.y, xAxis.z, 0,
yAxis.x, yAxis.y, yAxis.z, 0,
zAxis.x, zAxis.y, zAxis.z, 0,
coord.x, coord.y, coord.z, 1
]);
或者
const matrix4 = new Float32Array([...xAxis, 0, ...yAxis, 0, ...zAxis, 0, ...coord, 1]);
或用于创建mat4
const mat = mat4.create().fromValues(...xAxis, 0, ...yAxis, 0, ...zAxis, 0, ...coord, 1);
请记住,轴向量的长度会缩放该轴。
有时 3 轴并不完全垂直,可能会使 object 倾斜。 您可以使用 2 轴的叉积来找到第 3 轴。 示例 z 轴未知或未对齐。
const mat = mat4.create().fromValues(
...xAxis, 0,
...yAxis, 0,
...vec3.cross(vec3.create(), xAxis, yAxis), 0,
...coord, 1
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.