簡體   English   中英

如何沿任意軸縮放對象(在3D空間中)

[英]How To Scale Object Along Any Axis (In 3D Space)

我正在嘗試使用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,其中每個軸保持凸輪的俯仰,偏航和滾動弧度。 我的平移,旋轉等功能正常運行,但是在創建按比例縮放矩陣的理論方面需要幫助。

縮放矩陣的形式為:

{{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

我通過編寫基於pippin1289解決方案的函數解決了該問題

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縮放的矩陣

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM