在JungHyun Han撰写的 3D图形游戏编程的book中,在第38-39页,给出了
然而,这与我从线性代数中所知道的相矛盾。我的意思是基础转换矩阵不应该是该矩阵的转置吗?
请注意,作者进行了他的推导,但我找不到我所知道的和作者所处的缺失点。
代码: 顶点着色器:
#version 330
layout(location = 0) in vec4 position;
layout(location = 1) in vec4 color;
uniform vec3 cameraPosition;
uniform vec3 AT;
uniform vec3 UP;
uniform mat4 worldTrans;
vec3 ep_1 = ( cameraPosition - AT )/ length(cameraPosition - AT);
vec3 ep_2 = ( cross(UP, ep_1) )/length( cross(UP, ep_1 ));
vec3 ep_3 = cross(ep_1, ep_2);
vec4 t_ep_1 = vec4(ep_1, -1.0f);
vec4 t_ep_2 = vec4(ep_2, cameraPosition.y);
vec4 t_ep_3 = vec4(ep_3, cameraPosition.z);
mat4 viewTransform = mat4(t_ep_1, t_ep_2, t_ep_3, vec4(0.0f, 0.0f, 0.0f, 1.0f));
smooth out vec4 fragColor;
void main()
{
gl_Position = transpose(viewTransform) * position;
fragColor = color;
}
)glsl";
输入:
GLuint transMat = glGetUniformLocation(m_Program.m_shaderProgram, "worldTrans");
GLfloat dArray[16] = {0.0};
dArray[0] = 1;
dArray[3] = 0.5;
dArray[5] = 1;
dArray[7] = 0.5;
dArray[10] = 1;
dArray[11] = 0;
dArray[15] = 1;
glUniformMatrix4fv(transMat, 1, GL_TRUE, &dArray[0]);
GLuint cameraPosId = glGetUniformLocation(m_Program.m_shaderProgram, "cameraPosition");
GLuint ATId = glGetUniformLocation(m_Program.m_shaderProgram, "AT");
GLuint UPId = glGetUniformLocation(m_Program.m_shaderProgram, "UP");
const float cameraPosition[4] = {2.0f, 0.0f, 0.0f};
const float AT[4] = {1.0f, 0.0f, 0.0f};
const float UP[4] = {0.0f, 0.0f, 1.0f};
glUniform3fv(cameraPosId, 1, cameraPosition);
glUniform3fv(ATId, 1, AT);
glUniform3fv(UPId, 1, UP);
答案 0 :(得分:1)
虽然旋转,缩放或变形可以用表格中的4x4矩阵表示,但确实如此
您正在阅读的是所谓的" View Transformation"
要实现此矩阵,我们需要两个转换:首先,转换为相机位置,然后旋转相机。
进行这些转换的数据是:
C
(Cx,Cy,Cz)T
(Tx,Ty,Tz)UP
(Ux,Uy,Uz)
翻译可以用
表示
对于我们定义的轮换:
是F = T – C
,在正常化后,我们得到f = F / ||T-C||
,也由f= normalize(F)
表示
s = normalize(cross (f, UP))
u = normalize(cross(s, f))
s, u, -f
是旧坐标系中表示的新轴。
请注意,轴系统是OpenGL使用的系统,-f= cross(s,u)
。
现在,与您的GLSL代码相比,我看到:
f
(ep_1)向量进入对位方向。s
(ep_2)向量计算为cross(UP, f)
而不是cross(f, UP)
。这是对的,因为1)。u
(ep_3)相同。V
单元格(0,0)是错误的。它尝试使用-1.0f
。s,u,f
一起使用。mat4(c1,c2,c3,c4)
需要列向量作为参数。你通过了row-colums。但是,在main
之后transpose
使用了IEnumerable<string[]>
来纠正它。
在旁注中,您不会计算每个顶点的矩阵,时间,时间和时间......对吗?更好地在CPU端计算它并以if(按列顺序)作为统一传递。
答案 1 :(得分:0)