【发布时间】:2015-10-09 17:54:39
【问题描述】:
在我的 3D 世界实现中,我使用方向向量(单位向量)来决定我的 3D 对象的方向。
每个 3D 对象都有自己的方向向量,默认情况下方向向量为 V3(1,0,0),原点位于 V3(0,0,0)。
这就是我应用定向旋转矩阵“D”的方式(矩阵“A”用于围绕其方向向量作为轴旋转 3D 对象,这似乎工作正常):
Model3D model = actor.model;
// Loops through all the edges in the model
for (int i = 0; i < model.edges.length; i++) {
M3 D = directionMatrix(actor);
M3 R = rotationMatrix(actor);
// Draws a line based on each edge in the model.
// Each line consists of two points a and b.
// The matrix R rotates the points around a given axis.
// The D matrix rotates the points towards a given axis - not around it.
S.drawLine(g,
D.mul(R.mul(model.points[model.edges[i].a])).scale(actor.scale),
D.mul(R.mul(model.points[model.edges[i].b])).scale(actor.scale)
);
}
这就是我计算当前方向旋转矩阵“D”的方式:
public M3 directionalRotationMatrix(c_Actor3D actor) {
double x = Math.atan2(actor.direction.z, actor.direction.y);
double y = Math.atan2(actor.direction.x, actor.direction.z);
double z = Math.atan2(actor.direction.y, actor.direction.x);
double sin_x = Math.sin(x), sin_y = Math.sin(y), sin_z = Math.sin(z);
double cos_x = Math.cos(x), cos_y = Math.cos(y), cos_z = Math.cos(z);
return new M3(
cos_x * cos_y, (cos_x * sin_y * sin_z) - (sin_x * cos_z),
(cos_x * sin_y * cos_z) + (sin_x * sin_z), sin_x * cos_y, (sin_x * sin_y * sin_z) + (cos_x * cos_z),
(sin_x * sin_y * cos_z) - (cos_x * sin_z), -sin_y, cos_y * sin_z, cos_y * cos_z);
}
我的问题是创建正确的方向旋转矩阵,使 3D 对象在它们各自的方向向量的方向上旋转。
我完全不确定我做错了什么......我的想法是首先将立方体旋转到一个方向,然后围绕该方向的轴旋转立方体。毕竟是位置变换等等。
感谢你们的帮助!
【问题讨论】:
-
向矢量方向旋转……嗯?旋转通常围绕固定轴(可能作为向量给出)在某个方向上旋转,但我不明白你想要做什么。此外,问题是什么?你得到错误的结果?你得到了什么?
-
想象一下你有一个金字塔,也就是 5 个顶点被 8 条边包围......这个金字塔的中心在 V3(0, 0, 0),尖顶点的位置在 V3(0, 0, 1)。金字塔的其他点位于 V3(+-1, +-1, -1)。因此,底部有 4 个顶点,顶部有 1 个 -> 一个金字塔。我还有一个Direction-Vector,这个向量决定了金字塔应该面对的方向......所以我想做的是,根据Direction-Vector计算RoationMatrix,这样我就可以旋转金字塔中的所有顶点, 使金字塔的顶部朝向给定的方向。
-
部分回显 tobi303:什么不起作用?给我们一个例子,导致问题的输入类型,代码为该输入产生的输出,以及您认为输出应该是什么。 (除非错误很明显——比如抛出的异常或其他东西——请包括为什么您的输出比代码产生的更正确。)
-
另外,一个术语问题:您使用的术语“变换矩阵”和“旋转矩阵”似乎可以互换(有时带有“定向”前缀)。 是他们在你的例子中是一样的,还是我错过了一个区别?如果它们相同,那么如果您选择一个术语并坚持使用它可能会有所帮助 --- 可能是“rotation 矩阵”,因为这就是您的代码所称的。
-
是的,旋转矩阵...我不知道我为什么要写转换...我想要的是让我的 3d 对象面向一个方向,这个方向由我的“方向向量”确定。此外,当一个对象面向 dir-vector 的方向时,我希望能够进一步围绕 dir-vector 旋转对象。我想我想要实现的是俯仰-偏航-滚动旋转?我正在制作一个太空飞行射击/模拟器游戏..
标签: java c++ matrix 3d rotation