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,这个效果是正确的!!