三维的东西我涉及很少,
我想知道像Poser那样随意旋转人体位置变换视角是怎么搞的,
那位大哥能指点一下?
若有代码能指点小弟那更好(旋转规则物体就行),
小弟先谢了
我的MAIL: [email protected]

解决方案 »

  1.   

    以前编的:// 3DTransfor.h: interface for the C3DTransfor class.
    /*---------------------三维实体类---------------------------------*/
    /*------------------- by MasterDog -------------------------------*/
    #include <math.h>typedef double MATRIX4X4[4][4]; //4*4矩阵typedef struct _vertex //顶点
    {
    int x,y,z,w;
    }VERTEX;typedef struct _edge //边
    {
    UINT vertex1,vertex2;
    }EDGE;typedef struct _model //三维模型
    {
    UINT numVerts;
    VERTEX* vertices;
    UINT numEdges;
    EDGE* edges;
    }MODEL;class C3DTransfor  
    {
    public:
    void DrawModel(CWnd* pWnd, MODEL &model);
    void TransformModel(MODEL& model,int eye=300,int xTranslate=0,int yTranslate=0,int zTranslate=0,double xScale=1.0,double yScale=1.0,double zScale=1.0,int xRotate=0,int yRotate=0,int zRotate=0);
    void Transform(MODEL& shape,MATRIX4X4& m);
    void RotateZ(MATRIX4X4& m,int zAngle);
    void RotateY(MATRIX4X4& m,int yAngle);
    void RotateX(MATRIX4X4& m,int xAngle);
    void Scale(MATRIX4X4& m,double xScale,double yScale,double zScale);
    void Translate(MATRIX4X4& m,int xTrans,int yTrans,int zTrans);
    void PerspProject(MODEL& model,double eye);
    void MultMatrix(MATRIX4X4& product,MATRIX4X4& matrix1,MATRIX4X4& matrix2);
    void CopyMatrix(MATRIX4X4& dst,MATRIX4X4& src);
    void InitMatrix(MATRIX4X4& m);
    C3DTransfor();
    virtual ~C3DTransfor();};// 3DTransfor.cpp: implementation of the C3DTransfor class.
    //
    //////////////////////////////////////////////////////////////////////#include "stdafx.h"
    #include "3DTransfor.h"//////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////C3DTransfor::C3DTransfor()
    {}C3DTransfor::~C3DTransfor()
    {}void C3DTransfor::InitMatrix(MATRIX4X4 &m)
    {
    m[0][0]=1; m[0][1]=0; m[0][2]=0; m[0][3]=0;
    m[1][0]=0; m[1][1]=1; m[1][2]=0; m[1][3]=0;
    m[2][0]=0; m[2][1]=0; m[2][2]=1; m[2][3]=0;
    m[3][0]=0; m[3][1]=0; m[3][2]=0; m[3][3]=1;
    }void C3DTransfor::CopyMatrix(MATRIX4X4 &dst, MATRIX4X4 &src)
    {
    for(int i=0;i<4;++i)
    for(int j=0;j<4;++j)
    dst[i][j]=src[i][j];
    }void C3DTransfor::MultMatrix(MATRIX4X4 &product, MATRIX4X4 &matrix1, MATRIX4X4 &matrix2)
    {
    for(int row=0;row<4;++row)
    for(int col=0;col<4;++col)
    {
    double sum=0;

    for(int tmpVar=0;tmpVar<4;++tmpVar)
    sum+=matrix1[row][tmpVar]*matrix2[tmpVar][col];

    product[row][col]=sum;
    }
    }void C3DTransfor::PerspProject(MODEL &model, double eye) //透视投影
    {
    if(eye==0)
    return; for(UINT i=0;i<model.numVerts ;++i)
    {
    int xCoord = model.vertices [i].x;
    int yCoord = model.vertices [i].y;
    int zCoord = model.vertices [i].z;

    double t=1.0/(1.0 - zCoord /eye);

    model.vertices [i].x = (int) (xCoord*t);
    model.vertices [i].y = (int) (yCoord*t);
    }
    }void C3DTransfor::Translate(MATRIX4X4 &m, int xTrans, int yTrans, int zTrans) //平移
    {
    MATRIX4X4 m1, m2; m1[0][0]=1;  m1[0][1]=0;   m1[0][2]=0;    m1[0][3]=0;
    m1[1][0]=0;  m1[1][1]=1;   m1[1][2]=0;    m1[1][3]=0;
    m1[2][0]=0;  m1[2][1]=0;   m1[2][2]=1;    m1[2][3]=0;
    m1[3][0]=xTrans; m1[3][1]=yTrans; m1[3][2]=zTrans; m1[3][3]=1; MultMatrix(m2, m1, m); CopyMatrix(m, m2);
    }void C3DTransfor::Scale(MATRIX4X4 &m, double xScale, double yScale, double zScale) //缩放
    {
    MATRIX4X4 m1, m2; m1[0][0]=xScale; m1[0][1]=0; m1[0][2]=0; m1[0][3]=0;
    m1[1][0]=0; m1[1][1]=yScale; m1[1][2]=0; m1[1][3]=0;
    m1[2][0]=0; m1[2][1]=0; m1[2][2]=zScale; m1[2][3]=0;
    m1[3][0]=0; m1[3][1]=0; m1[3][2]=0; m1[3][3]=1; MultMatrix(m2, m1, m); CopyMatrix(m, m2);
    }void C3DTransfor::RotateX(MATRIX4X4 &m, int xAngle) //绕X轴旋转
    {
    MATRIX4X4 m1, m2; if(xAngle == 0) return; double radians = 6.283185308 / (360.0 / xAngle);
    double c = cos(radians);
    double s = sin(radians); m1[0][0]=1; m1[0][1]=0; m1[0][2]=0; m1[0][3]=0;
    m1[1][0]=0; m1[1][1]=c; m1[1][2]=s; m1[1][3]=0;
    m1[2][0]=0; m1[2][1]=-s; m1[2][2]=c; m1[2][3]=0;
    m1[3][0]=0; m1[3][1]=0; m1[3][2]=0; m1[3][3]=1; MultMatrix(m2, m1, m);
    CopyMatrix(m , m2);
    }void C3DTransfor::RotateY(MATRIX4X4 &m, int yAngle) //绕Y轴旋转
    {
    MATRIX4X4 m1, m2; if(yAngle == 0) return; double radians = 6.283185308 / (360.0 / yAngle);
    double c = cos(radians);
    double s = sin(radians); m1[0][0]=c; m1[0][1]=0; m1[0][2]=-s; m1[0][3]=0;
    m1[1][0]=0; m1[1][1]=1; m1[1][2]=0; m1[1][3]=0;
    m1[2][0]=s; m1[2][1]=0; m1[2][2]=c; m1[2][3]=0;
    m1[3][0]=0; m1[3][1]=0; m1[3][2]=0; m1[3][3]=1; MultMatrix(m2, m1, m);
    CopyMatrix(m , m2);
    }void C3DTransfor::RotateZ(MATRIX4X4 &m, int zAngle) //绕Z轴旋转
    {
    MATRIX4X4 m1, m2; if(zAngle == 0) return; double radians = 6.283185308 / (360.0 / zAngle);
    double c = cos(radians);
    double s = sin(radians); m1[0][0]=c; m1[0][1]=s; m1[0][2]=0; m1[0][3]=0;
    m1[1][0]=-s; m1[1][1]=c; m1[1][2]=0; m1[1][3]=0;
    m1[2][0]=0; m1[2][1]=0; m1[2][2]=1; m1[2][3]=0;
    m1[3][0]=0; m1[3][1]=0; m1[3][2]=0; m1[3][3]=1; MultMatrix(m2, m1, m);
    CopyMatrix(m , m2);
    }void C3DTransfor::Transform(MODEL &shape, MATRIX4X4 &m) //综合变换
    {
    int transformedX, transformedY, transformedZ; for(UINT i=0;i<shape.numVerts;++i)
    {
    transformedX = (int)(shape.vertices[i].x * m[0][0] +
    shape.vertices[i].y * m[1][0] +
    shape.vertices[i].z * m[2][0] + m[3][0]);
    transformedY = (int)(shape.vertices[i].x * m[0][1] +
    shape.vertices[i].y * m[1][1] +
    shape.vertices[i].z * m[2][1] + m[3][1]);
    transformedZ = (int)(shape.vertices[i].x * m[0][2] +
    shape.vertices[i].y * m[1][2] +
    shape.vertices[i].z * m[2][2] +m[3][2]); shape.vertices[i].x=transformedX;
    shape.vertices[i].y=transformedY;
    shape.vertices[i].z=transformedZ;
    }
    }void C3DTransfor::TransformModel(MODEL& model,int eye,int xTranslate, int yTranslate, int zTranslate, double xScale, double yScale, double zScale, int xRotate, int yRotate, int zRotate)
    {
    MATRIX4X4 m;
    InitMatrix(m); Translate(m,xTranslate,yTranslate,zTranslate);
    Scale(m,xScale,yScale,zScale);
    RotateX(m,xRotate);
    RotateY(m,yRotate);
    RotateZ(m,zRotate);
    Transform(model,m);
    PerspProject(model,eye);
    }void C3DTransfor::DrawModel(CWnd* pWnd, MODEL &model)
    {
    int newX,newY;
    RECT ClientRect; CClientDC ClientDC(pWnd); GetClientRect(pWnd->GetSafeHwnd(),&ClientRect); int maxX=ClientRect.right ;
    int maxY=ClientRect.bottom ; for(UINT i=0;i<model.numEdges ;++i)
    {
    UINT vertNum=model.edges[i].vertex1 ;
    newX = maxX/2 + model.vertices[vertNum-1].x ;
    newY = maxY/2 - model.vertices[vertNum-1].y-1;
    ClientDC.MoveTo(newX,newY); vertNum = model.edges[i].vertex2 ;
    newX = maxX/2 + model.vertices[vertNum-1].x;
    newY = maxY/2 - model.vertices[vertNum-1].y-1;
    ClientDC.LineTo(newX,newY);
    }
    }
      

  2.   

    楼上的老兄真认真,其实你找一本计算机图形学的书就知道了,原理是用矩阵相乘,但在小程序里的实现根本用不找这么麻烦,如果你学过矩阵相乘的话用一般乘法就可以实现。当然,像poser这样的大型三维程序里当然要用矩阵了。绕x轴旋转m度tempX=x
    tempY=y
    tempZ=z
    x=tempX
    y=tempY*cos(m) - tempZ*sin(m)
    z=tempX*sin(m) + tmepZ*cos(m)绕y轴旋转m度tempX=x
    tempY=y
    tempZ=z
    x=tempX*cos(m) + tempY*sin(m)
    y=tempY
    z= - tempX*sin(m) + tmepY*cos(m)绕z轴旋转m度tempX=x
    tempY=y
    tempZ=z
    x=tempX*cos(m)-tmepY*sin(m)
    y=tempX*sin(m)+tempY*cos(m)
    z=tempZ
      

  3.   

    建议你看看 OPGL 方面的书。
    很简单的。
    何必自己去做那些复杂的运算有了大炮还用弹弓?
    ================================================================
    来自光哥的问候 
     l i u g y
     :)  CSDN 论 坛 助 手
      

  4.   

    okok,那如果要弄出像Poser那样的旋转,那该怎么玩?
    我搞不懂,对于一个不规则的物体,旋转之后,我怎么知道该在那个面上画些什么东西,譬如像人体模型,开始面对着我,我旋转180度后,我怎么知道那个人的背面该怎么画?图像的信息是怎么来的?解惑解惑,先谢谢上面的哥们
      

  5.   

    okok,那如果要弄出像Poser那样的旋转,那该怎么玩?
    我搞不懂,对于一个不规则的物体,旋转之后,我怎么知道该在那个面上画些什么东西,譬如像人体模型,开始面对着我,我旋转180度后,我怎么知道那个人的背面该怎么画?图像的信息是怎么来的?解惑解惑,先谢谢上面的哥们
      

  6.   

    嗯,实际上在程序中做到上述功能需要两个方面:1.如何构建3D模型
    2.如何驱动(旋转、平移缩放、纹理映射、等等)3D模型。那么每一个方面都有成熟的商用软件实现,建模的过程本质上就是构造点、线、面的过程。工具非常多,比如3DMax、Multigen Creator、Poser、Maya等等。可以选择OpenGL进行程序设计,(DirectX也可以).比如就用OpenGL库,或者第三方提供的开发环境:OpenGVS、VTree等等开发。建议你看一些图形图像方面的书,就不会对旋转人体那么崇拜了,呵呵!