首先,我的要求是在顶点着色器中计算广告牌矩阵。
广告牌的位置不会改变,但方向面向相机。
然后,摄像机围绕任何轴实时旋转。
我的代码是:
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旋转。
答案 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]
。x = originalMatrix[0].xyz
,y = originalMatrix[1].xyz
,z = originalMatrix[2].xyz
的左上角3x3部分。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];