透视投影,坐标系转换的问题。
大家好,
我在做3d正方体。
步骤是将正方体在世界坐标的顶点转换成相机坐标系内顶点,我已完成。
然后将相机坐标系内的顶点通过透视投影转换到规则观察体中(Canonical View Volume)
问题来了。
我的正方体在世界坐标系内的顶点为:
Vertex v1(5.0, 5.0, 10.0, 1.0, 5.0, 5.0, 5.0,1.0);//001 Vertex v2(10.0, 5.0, 10.0, 1.0, 5.0, 5.0, 5.0,1.0);//101 Vertex v3(5.0, 10.0, 10.0, 1.0, 5.0, 5.0, 5.0,1.0);//011 Vertex v4(10.0, 10.0, 10.0, 1.0, 5.0, 5.0, 5.0,1.0);//111 Vertex v5(5.0, 10.0, 5.0, 1.0, 5.0, 5.0, 5.0,1.0);//010 Vertex v6(10.0, 10.0, 5.0, 1.0, 5.0, 5.0, 5.0,1.0);//110 Vertex v7(5.0, 5.0, 5.0, 1.0, 5.0, 5.0, 5.0,1.0);//000 Vertex v8(10.0, 5.0, 5.0, 1.0, 5.0, 5.0, 5.0,1.0);//100
void CameraCoord::frustum(int l, int r, int b, int t, int n, int f){ //这是投影矩阵。 double perspective[] = { 2*n/(r-l), 0, (r+l)/(r-1), 0, 0, 2*n/(t - b), (t+b)/(t-b), 0, 0, 0, -(n+f)/(n-f), -2*n*f/(n-f), 0, 0, -1, 0 }; for(int i = 0; i < 16; i++) perspectiveMatrix.push_back(perspective[i]);//投影矩阵}void RGBCube::projectionTransformation(Vertex *v){ CameraCoord camera; camera.frustum(-5,5,-5,5,-5,-25); double vx = v->x; double vy = v->y; double vz = v->z; double vw = v->w; v->x = vx * camera.perspectiveMatrix[0] + vy * camera.perspectiveMatrix[1] + vz * camera.perspectiveMatrix[2] + vw * camera.perspectiveMatrix[3]; v->y = vx * camera.perspectiveMatrix[4] + vy * camera.perspectiveMatrix[5] + vz * camera.perspectiveMatrix[6] + vw * camera.perspectiveMatrix[7]; v->z = vx * camera.perspectiveMatrix[8] + vy * camera.perspectiveMatrix[9] + vz * camera.perspectiveMatrix[10] + vw * camera.perspectiveMatrix[11]; v->w = vx * camera.perspectiveMatrix[12] + vy * camera.perspectiveMatrix[13] + vz * camera.perspectiveMatrix[14] + vw * camera.perspectiveMatrix[15]; cout<<v->x<<","<<v->y<<","<<v->z<<endl;}