Opengl es 任意轴广告牌矩阵

Opengl es 任意轴广告牌矩阵,opengl-es,camera,rotation,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 )

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

广告牌的位置不会改变,但方向朝向摄影机

然后,相机围绕任意轴实时旋转

我的代码是:

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轴旋转。

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

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];
至少我希望你这样使用矩阵

  • 这意味着您将保留存储在
    原始矩阵[3]
    中的位置
  • 您将放弃矩阵左上角3x3部分的旋转,因此结果就像是在二维中绘制一样
  • 由于基本向量与原始基本向量的长度相乘,因此将保留对象的任何缩放。基向量是左上角的3x3部分,如
    x=originalMatrix[0]。xyz
    y=originalMatrix[1]。xyz
    z=originalMatrix[2]。xyz
  • 您将放弃每个维度的所有缩放。这些由基向量旁边的
    w
    组件定义。大多数情况下,
    Z
    用于根据对象(平截头体)的距离更改
    X
    Y
    。要保留需要更改为的内容,请执行以下操作:
保留投影比例:

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];

无论如何,我必须感谢你们,非常感谢你们。我发现了一个示例方法,我用vec3 up=vec3(0.0,1.0,0.0)替换了worldCameraUp,这个效果是正确的!!