我正在用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 -(速度*速度))是物理部分(洛伦兹收缩),gl.Rotation是一个vec3,其中每个轴都保持凸轮的俯仰、偏航和滚动半径。我的平移,旋转等功能工作正常,但我需要理论上的帮助,建立一个矩阵的规模。
发布于 2013-08-12 13:49:51
我通过编写这个基于pippin1289 1289的解决方案的函数来解决这个问题。
mat4 ScaleOnAxis(float3 a)
{
a = Norm3f(a);
if(a == x || (a.x == -1.0f && a.y == 0.0f && a.z == 0.0f))
return Scale(0.2f, 1.0f, 1.0f);
float3 axis = Cross(a, x);
float theta = acos(Dot(a, x));
if(theta > pi / 2)
{
axis = axis * -1.0f;
theta = pi - theta;
}
Quaternion ToRotation(axis.x, axis.y, axis.z, theta);
Quaternion FromRotation(axis.x, axis.y, axis.z, tau - theta);
return mat4(FromRotation) * (Scale(float3(0.2f, 1.0f, 1.0f)) * mat4(ToRotation));
}
它返回一个矩阵,它将在轴上缩放0.2。
发布于 2013-08-11 13:53:29
缩放矩阵的形式如下:
{{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
https://stackoverflow.com/questions/18176983
复制相似问题