游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2326|回复: 3

此函数的内部功能不理解,望高手解释???

[复制链接]

1

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2010-11-24 10:44:00 | 显示全部楼层 |阅读模式
 此函数的内部功能不理解,望高手解释???
 void CALLBACK myReshape(GLsizei w,GLsizei h)
  {
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if(w<=h)
      glOrtho(-1.5,1.5,-1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w,-10.0,10.0);
    else
      glOrtho(-1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w,-1.5,1.5,-10.0,10.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
  }




源码为:

  #include "glos.h"
  #include <GL/gl.h>
  #include <GL/glaux.h>

  void myinit(void);
  void CALLBACK myReshape(GLsizei w,GLsizei h);
  void CALLBACK display(void);

  void myinit(void)
  {
    glClearColor(0.0,0.0,0.0,0.0);
    glClear(GL_COLOR_BUFFER_BIT);
  }

  void CALLBACK myReshape(GLsizei w,GLsizei h)
  {
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if(w<=h)
      glOrtho(-1.5,1.5,-1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w,-10.0,10.0);
    else
      glOrtho(-1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w,-1.5,1.5,-10.0,10.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
  }

  void CALLBACK display(void)
  {
    glColor3f(1.0,1.0,0.0);
    auxWireSphere(1.0);
    glFlush();
  }

  void main(void)
  {
    auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);
    auxInitPosition(0,0,500,500);
    auxInitWindow("AUX_SAMPLE");
    myinit();
    auxReshapeFunc(myReshape);
    auxMainLoop(display);
  }

34

主题

844

帖子

1755

积分

金牌会员

Rank: 6Rank: 6

积分
1755
发表于 2010-11-24 10:59:00 | 显示全部楼层

Re: 此函数的内部功能不理解,望高手解释???

  1. void CALLBACK myReshape(GLsizei w,GLsizei h)[color=green]//创建一个回调函数,名为myReshape。[/color]
  2.   {
  3.     glViewport(0,0,w,h);[color=green]//OpenGL显示面积为整个窗口面积。[/color]
  4.     glMatrixMode(GL_PROJECTION);[color=green]//先设置摄像机参数[/color]
  5.     glLoadIdentity();[color=green]//初始化[/color]
  6.     if(w<=h)[color=green]//如果宽度小于等于高度,属于非正规窗口[/color]
  7.       glOrtho(-1.5,1.5,-1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w,-10.0,10.0);
  8.       [color=green]//采用“平行投影(不带“近大,远小”特点)”[/color]
  9.       [color=green]//左右范围1.5,上下范围1.5*高宽比,深度范围10[/color]
  10.     else[color=green]//不然,则是横向更长的普通窗口[/color]
  11.       glOrtho([color=red]-1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w[/color],-1.5,1.5,-10.0,10.0);
  12.       [color=green]采用“平行投影(不带“近大,远小”特点)”[/color]
  13.       [color=green]左右范围1.5*宽高比,上下范围1.5,深度范围10[/color]
  14.     glMatrixMode(GL_MODELVIEW);[color=green]//然后准备放物体(刚才是设置摄像机参数,这次是放物体)[/color]
  15.     glLoadIdentity();[color=green]//初始化[/color]
  16.   }
复制代码

上面红色标记的代码我认为是错误的。
(GLfloat)h/(GLfloat)w 应该改为“宽高比”,也就是 (GLfloat)w/(GLfloat)h

1

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2010-11-24 11:22:00 | 显示全部楼层

Re:此函数的内部功能不理解,望高手解释???

    if(w<=h)//如果宽度小于等于高度,属于非正规窗口      glOrtho(-1.5,1.5,-1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w,-10.0,10.0);      //采用“平行投影(不带“近大,远小”特点)”      //左右范围1.5,上下范围1.5*高宽比,深度范围10    else//不然,则是横向更长的普通窗口      glOrtho(-1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w,-1.5,1.5,-10.0,10.0);      采用“平行投影(不带“近大,远小”特点)”      左右范围1.5*宽高比,上下范围1.5,深度范围10

glOrtho()函数中的参数是不是可以理解成倍的缩减

21

主题

158

帖子

174

积分

注册会员

Rank: 2

积分
174
发表于 2010-12-13 13:55:00 | 显示全部楼层

Re:此函数的内部功能不理解,望高手解释???

glOrtho是正交投影

假设你以某个随意角度观察一个正立方体

正交投影下 立方体的每个面,相对的边在2D上是平行的,投影后依然平行
透视投影下 存在灭点,原本平行的边,如果你画出延长线,最终是会在灭点处相交的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-5-30 11:20

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表