·天新网首页·加入收藏·设为首页·网站导航
数码笔记本手机摄像机相机MP3MP4GPS
硬件台式机网络服务器主板CPU硬盘显卡
办公投影打印传真
家电电视影院空调
游戏网游单机动漫
汽车新车购车试驾
下载驱动源码
学院开发设计
考试公务员高考考研
业界互联网通信探索
您现在的位置:天新网 > 软件开发 > 开发语言 > 汇编
Win32 OpenGL编程(7) 3D视图变换——真3D的关键
http://www.21tx.com 2009年10月27日 CSDN 九天雁翎

1 2 3 4 5 6 下一页

  照相机比喻

  在《OpenGL Programming Guide》中将所有的3D变换统一到一个有意思的现实世界模型,照相机比喻。

  1.确定照相机的位置的过程对应于“视图变换”(Viewing Transformations)

  2.确定物体位置的过程对应于“模型变换”(Modeling Transformations)

  3.确定照相机放大倍数的过程对应于“投影变换”(Projection Transformations)

  4.确定照片大小的过程对应于“视口变换”(Viewport Transformations)

  实际的照相过程遵循这个过程,在我们处理3D图形的时候也遵循这个过程,其中,上述的4个变换就是我今天准备介绍的。

  视图变换——确定视角

  现实生活中的物体,从不同的角度观察,我们看到的东西是不一样的,这还引发了历史上著名的“金银盾事件”(实际上是寓言-_-!),从一面看,是金盾,一面看是银盾,从中间看是一面金,一面银。。。。。。

  以《Win32 OpenGL编程(6) 踏入3D世界》(以后简称XO6,该系列文章类似)一例中最后最复杂的三角锥为例,此例中是三角锥本身在旋转,我们的观察角度并没有变。现在我们反过来,三角锥不动,我们自己移动自己的位置,看看三角锥不同方向的样子。现实生活中你看雕塑可不是总能让别人扛着雕塑旋转吧-_-!这时候,总得自己走动走动。这个时候,我们变化的是观察的角度,但是看到的确是雕塑不同的侧面。见下例,我们可以从不同的观察角度来观察这个简单的三角锥。见下例:

// 观察者位置
GLfloat gViewPosX;
GLfloat gViewPosY;
GLfloat gViewPosZ = 1.0;
// 观察者视角方向
GLfloat gViewDirX = 0.0;
GLfloat gViewDirY = 0.0;
GLfloat gViewDirZ = 0.0;
GLfloat gViewUpDirX = 0.0;
GLfloat gViewUpDirY = 1.0;
GLfloat gViewUpDirZ = 0.0;
// 是改变位置还是视角
bool gbChangePos = true;

 
//这里进行所有的绘图工作
void SceneShow(GLvoid)        
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 0.0, 0.0);
    glPushMatrix();
    DrawSmoothColorPyramid(0.5);
    glPopMatrix();
    glLoadIdentity();
    gluLookAt(gViewPosX, gViewPosY, gViewPosZ, 0.0, 0.0, 0.0, gViewDirX, gViewDirY, gViewDirZ);
    glFlush();
}  

int Game_Main(void *parms = NULL, int num_parms = 0)
{
    DWORD dwStartTime;
    dwStartTime = GetTickCount();
    // this is the main loop of the game, do all your processing
    // here
    // for now test if user is hitting ESC and send WM_CLOSE
    if (KEYDOWN(VK_ESCAPE))
        SendMessage(ghWnd,WM_CLOSE,0,0);
    if(gbChangePos)
    {
        if (KEYDOWN(VK_UP))
        {
            gViewPosY += 0.01;
            gViewPosZ = sqrt( 1.0 - gViewPosY * gViewPosY);
        }
        if (KEYDOWN(VK_DOWN))
        {
            gViewPosY -= 0.01;
            gViewPosZ = sqrt( 1.0 - gViewPosY * gViewPosY);
        }
        if (KEYDOWN(VK_LEFT))
        {
            gViewPosX += 0.01;
            gViewPosZ = sqrt( 1.0 - gViewPosX * gViewPosX);
        }
        if (KEYDOWN(VK_RIGHT))
        {
            gViewPosX -= 0.01;
            gViewPosZ = sqrt( 1.0 - gViewPosX * gViewPosX);
        }
    }
    else
    {
        if (KEYDOWN(VK_UP))
        {
            gViewDirY += 0.01;
        }
        if (KEYDOWN(VK_DOWN))
        {
            gViewDirY -= 0.01;
        }
        if (KEYDOWN(VK_LEFT))
        {
            gViewDirX += 0.01;
        }
        if (KEYDOWN(VK_RIGHT))
        {
            gViewDirX -= 0.01;
        }
    }
    if (KEYDOWN(VK_NUMPAD8))
    {
        gViewUpDirY += 0.01;
    }
    if (KEYDOWN(VK_NUMPAD2))
    {
        gViewUpDirY -= 0.01;
    }
    if (KEYDOWN(VK_NUMPAD6))
    {
        gViewUpDirX += 0.01;
    }
    if (KEYDOWN(VK_NUMPAD4))
    {
        gViewUpDirX -= 0.01;
    }
    SceneShow();

    // 控制帧率
    while(GetTickCount() - dwStartTime < TIME_IN_FRAME)
    {
        Sleep(1);
    }

    // return success or failure or your own return code here
    return(1);
} // end Game_Main

 
// enter main event loop
while(TRUE)
{
    // test if there is a message in queue, if so get it
    if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    { 
        // test if this is a quit
        if (msg.message == WM_QUIT)
            break;
        if (msg.message == WM_KEYDOWN)
        {
            if(msg.wParam == VK_INSERT)
            {
                gbChangePos = !gbChangePos;
            }
        }
        // translate any accelerator keys
        TranslateMessage(&msg);
        // send the message to the window proc
        DispatchMessage(&msg);
    } // end if
    // main game processing goes here
    Game_Main();
} // end while
// closedown game here
Game_Shutdown();
// return to Windows like this
return(msg.wParam);
 end WinMain

上一篇: 说清汇编中的栈操作地址问题
下一篇: 用win32汇编画八卦图

1 2 3 4 5 6 下一页

关于我们 | 联系我们 | 加入我们 | 广告服务 | 投诉意见 | 网站导航
Copyright © 2000-2011 21tx.com, All Rights Reserved.
晨新科技 版权所有 Created by TXSite.net