我正在尝试使用 opengl 用 c++ 编写一个物理模拟器,并且我需要能够沿着相机面向的轴缩放对象(现在主要是立方体)。
我可以使用它作为我的模型矩阵来完美地绘制对象:
mat4 Model = Translate(cube.Position - float3(gl.Position.x, gl.Position.y, -gl.Position.z)) * Rotate(cube.Rotation) * Scale(cube.Scale);
其中 gl.Position 是凸轮的位置,float3 是像我编写的类一样的 vec3,等等...
所以我尝试修改该行以在其他所有内容之前包含缩放因子(首先应用最后的内容):
mat4 Model = Translate(cube.Position - float3(gl.Position.x, gl.Position.y, -gl.Position.z)) * Rotate(cube.Rotation) * Scale(cube.Scale) * (Rotate(float3(gl.Rotation.x, gl.Rotation.y, gl.Rotation.z)) * Scale(float3(1.0f, 1.0f, sqrt(1 - (velocity * velocity)))) * Rotate(float3(tau - gl.Rotation.x, tau - gl.Rotation.y, tau - gl.Rotation.z)));
最后一部分很重要,我旋转对象,缩放它,然后将其旋转回去。 sqrt(1 - (velocity *velocity)) 是物理部分(洛伦兹收缩),gl.Rotation 是vec3,其中每个轴以凸轮的弧度保存俯仰、偏航和滚动。我的平移、旋转等功能正常工作,但我需要创建可缩放矩阵的理论帮助。
最佳答案
缩放矩阵的形式为:
{{s_x, 0, 0, 0},
{0, s_y, 0, 0},
{0, 0, s_z, 0},
{0, 0, 0, 1}}
假设统一坐标。
要应用它们,您需要缩放,然后旋转,然后平移。我建议使用 gl 函数来执行此操作。假设您希望对象位于 x、y、z 位置,并且其旋转位于四元数 {theta, r_x, r_y, r_z} 中。缩放和旋转需要在模型坐标系中进行。 GL 以适当的顺序应用转换,因此其代码如下所示:
glTranslatef(x, y, z);
glRotatef(theta, r_x, r_y, r_z);
glScalef(s_x, s_y, s_z);
//draw my model
关于c++ - 如何沿任意轴缩放对象(在 3D 空间中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18176983/