任意轴广告牌矩阵

时间:2017-05-09 02:07:42

标签: opengl-es camera rotation

首先,我的要求是在顶点着色器中计算广告牌矩阵。

广告牌的位置不会改变,但方向面向相机。

然后,摄像机围绕任何轴实时旋转。

我的代码是:

mat4 BillboardMatrix( vec3 pos)
{
    vec3 forward = normalize(pos - worldCameraPos);

    vec3 side = cross( forward, worldCameraUp);


   mat4 result;
   result[0] = vec4( side, 0.0 );
   result[1] = vec4( worldCameraUp,0.0);
   result[2] = vec4( forward.x, 0.0, forward.z , 0.0 );
   result[3] = vec4( 0.0, 0.0, 0.0, 1.0 );
   return result;
}

问题:

当相机围绕X轴或Y轴旋转时,效果是正确的。当相机绕Z轴旋转时,广告牌也在旋转,我不希望这个Z旋转。

1 个答案:

答案 0 :(得分:0)

您可以通过执行以下操作强制基本向量进行标识:

result[0] = vec4(1.0, .0, .0, .0);
result[1] = vec4(.0, 1.0, .0, .0);
result[2] = vec4(.0, .0, 1.0, .0);

这会丢弃比例,但是如果你需要它,那么你需要先找到基矢量的长度并将它们与它们相乘:

mat4 originalMatrix; // The matrix without billboarding

mat4 result;
result[0] = vec4(length(originalMatrix[0].xyz), .0, .0, .0);
result[1] = vec4(.0, length(originalMatrix[1].xyz), .0, .0);
result[2] = vec4(.0, .0, length(originalMatrix[2].xyz), .0);
result[3] = originalMatrix[3];

至少我希望你这样使用矩阵。

  • 这意味着您将保留originalMatrix[3]
  • 中存储的位置
  • 您将丢弃旋转,它是矩阵的左上角3x3部分,因此结果就像您在2d中绘制一样。
  • 您将保留对象的任何缩放,因为基本向量与原始基向量的长度相乘。基本向量是x = originalMatrix[0].xyzy = originalMatrix[1].xyzz = originalMatrix[2].xyz的左上角3x3部分。
  • 您将丢弃每个维度的所有缩放。这些由基矢量旁边的w分量定义。大多数Z用于更改XY,具体取决于对象的距离(视锥体)。要保留您需要更改为:

保留投影比例:

mat4 originalMatrix; // The matrix without billboarding

mat4 result;
result[0] = vec4(length(originalMatrix[0].xyz), .0, .0, originalMatrix[0].w);
result[1] = vec4(.0, length(originalMatrix[1].xyz), .0, originalMatrix[1].w);
result[2] = vec4(.0, .0, length(originalMatrix[2].xyz), originalMatrix[2].w);
result[3] = originalMatrix[3];