OpenGL中gluLookAt()函数的应用_glulookat 链接库-程序员宅基地

技术标签: vector  up  float  class  

 

今天写了一个自己的Camera:

声明如下:

#include "vector3.h"
#ifndef __Camera_H__
#define __Camera_H__

namespace LearnOpenGL
{
 class CCamera
 {
 public:
  CCamera(void);
  ~CCamera(void);

  //绕X轴旋转
  void RotatePitch(void);
  //绕Y轴旋转
  void RotateYaw(void);
  //绕Z轴旋转  
  void RotateRoll(void);


  CVector3* position;
  CVector3* lookAt;
  CVector3* forward;
  CVector3* up;
  CVector3* right;

  //设置当前gluLookAt参数
  void SetCamera();

  void SetLookAt(CVector3* objectPosition);

 private:
  //摄像机移动的步长
  float step;
 public:
  // 对键盘事件进行响应:wsad
  void KeyPressed(const unsigned char key);
 };
}
#endif

其中SetCamera()成员函数用来指定摄像机所处位置,观察点位置和向上的向量,

定义如下:

void LearnOpenGL::CCamera::SetCamera(void)
{
 gluLookAt(position->x,position->y,position->z,
  lookAt->x,lookAt->y,lookAt->z,
  up->x,up->y,up->z);
}

其中触及到了gluLookAt()函数的使用时机问题,以前一直没有注意,

这里着重写一下:

以前只使用gluPerspective()函数时,把定义视口(glViewport())函数和透影函数都放在了ChangeSize()函数中,现在因为要使用gluLookAt()函数,需要进行分解。把透视投影矩阵和gluLookAt()函数专门分出既可。

新的ChangeSize()函数定义如下:

void ChangeSize(int width, int height)
{
 winWidth = width;
 winHeight = height;
 fprintf(stdout,"ChangeSize::/n/n");
 glViewport(0,0,width,height);
}

在RenderScene()函数中,清空颜色和深度缓冲后,调用新增加的SetCamera()函数,使得CCamera类对象使以发挥作用。定义如下:

void SetCamera(void)
{
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity(); 
 gluPerspective(60,winHeight/winHeight,1,2000);
 myCamera->SetCamera();
 glMatrixMode(GL_VIEWPORT);
}

按照上面的定义,就可以使在CCamera类对象的中gluLookAt()函数发挥作用了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/buxiangshui_cd/article/details/1607371

智能推荐

18_集合框架_第18天_集合、Iterator迭代器、增强for循环 、泛型_讲义_18_集合_第1天(collection、迭代器、泛型)_讲义.doc-程序员宅基地

文章浏览阅读427次。今日内容介绍1、集合2、Iterator迭代器3、增强for循环4、泛型01集合使用的回顾*A:集合使用的回顾*a.ArrayList集合存储5个int类型元素*b.ArrayList集合存储5个Person类型元素package cn.incast.demo01;public class Person { private String name; private int..._18_集合_第1天(collection、迭代器、泛型)_讲义.doc

gets()与getchar()的区别以及英文句子的二次逆置。_gets和getchar的区别-程序员宅基地

文章浏览阅读762次。问题:有一个字符数组的内容为:“student a am i”,请你将数组的内容改为"i am a student".要求:不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。student a am ii ma a tnedutsi am a student解题思路: 先将创建一个数组,将输入的字符通过gets()存入数组中,然后将数组中所有的单词逆置,再将每一个遇..._gets和getchar的区别

Flink_rak553+554 flylink-程序员宅基地

文章浏览阅读120次。这里写目录标题1 Flink简介1.1 什么是Flink1.2 Flink特点二 Flink整体架构1 Flink简介1.1 什么是Flink1.2 Flink特点二 Flink整体架构_rak553+554 flylink

log4j日志级别以及配置_log4j.appender.d.threshold没有指定这个可以输出什么级别的日志-程序员宅基地

文章浏览阅读507次。日志记录器(Logger)的行为是分等级的。分为 - OFF - FATAL - WARN - INFO - DEBUG - TRACE - ALL Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。 比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志..._log4j.appender.d.threshold没有指定这个可以输出什么级别的日志

JavaCV异常:av_write_frame() error -22 while writing video packet解决方法_av_interleaved_write_frame() error -22 while writi-程序员宅基地

文章浏览阅读4.8k次。av_write_frame()error -22 while writing video packet解决方法问题分析解决方法项目码云(Gitee)地址:https://gitee.com/banmajio/RTSPtoRTMP项目github地址:https://github.com/banmajio/RTSPtoRTMP个人博客:banmajio’s blogjavacv使用f..._av_interleaved_write_frame() error -22 while writing interleaved video packe

Android 模仿android5上的Reveal实现_@color/reveal_color-程序员宅基地

文章浏览阅读1.6k次。模仿android5上的Reveal实现 大家应该都接触过安卓5吧,上面的按钮点击的时候会出现波纹的动画,那个是新出来的一个reveal,但是在低版本的系统上不支持,只能想办法自己实现了,同样也是看到了任老师的实现方法,自己分析了一会儿后,加上了点自己的见解,分享给大家,demo的源码我已经上传了. 实现的基本原理就是,自定义_@color/reveal_color

随便推点

【centos8】用kvm安装虚拟机_warning graphics requested but display is not set.-程序员宅基地

文章浏览阅读2.2k次。一 环境准备pc机 1T硬盘 16G内存 vmware workstation 15安装 centos8 操作系统;配置支持虚拟化二 安装 qemu-kvm[root@localhost ~]# yum install qemu-kvmCentOS-8 - AppStream 6.3 kB/s..._warning graphics requested but display is not set. not running virt-viewer.

机器学习:调用weka的Classifier分类器代码Demo_weka.classifiers.classifier;-程序员宅基地

文章浏览阅读687次。weka中实现了很多机器学习算法,不管实验室研究或者公司研发,都会或多或少的要使用weka,我的理解是weka是在本地的SparkML,SparkML是分布式的大数据处理机器学习算法,数据量不是很大的时候,使用weka可以模拟出很好的效果,决定使用哪个模型,然后再继续后续的数据挖掘工作。下面总结一个eclipse中调用weka的Classifier分类器代码的Demo,通过这个实例,可以进一步跟..._weka.classifiers.classifier;

使用ThreadMXBean发现死锁_threadmxbean getthreadinfo-程序员宅基地

文章浏览阅读372次。利用JDK自带的ThreadMXBean发现程序中出现的死锁。import java.lang.management.ManagementFactory;import java.lang.management.ThreadInfo;import java.lang.management.ThreadMXBean;import java.util.concurrent.TimeUnit;public class FindDeadLock implements Runnable { i_threadmxbean getthreadinfo

CardView圆角阴影消除的方法_cardcornerradius 圆角有阴影-程序员宅基地

文章浏览阅读3k次。今天我设置了CardView的圆角,但是有阴影,很影响美观。后来经过各种搜索,终于找到了解决办法,那就是将CardView作为根布局:<?xml version="1.0" encoding="utf-8"?><android.support.v7.widget.CardView ="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk_cardcornerradius 圆角有阴影

Json::FastWriter writer的顺序对MD5加密的影响-程序员宅基地

文章浏览阅读1.9k次。Json::FastWriter writer的顺序在使用Json::FastWriter writer会改变josn写入时的顺序,这是因为使用jsoncpp创建文件的时候,它是按照字母表给排序过的,在排序的过程中,需要注意大小字母是不做区分的,还得安装后面字母比对做后面的排序。在使用Json::Value root;写入键值时的顺序,通过writer再写回到字符串时,顺序会发生变化:Json::FastWriter writer; //Json::StyledWriter writer;_json::fastwriter

周中训练总结_中训进步周-程序员宅基地

文章浏览阅读123次。这周刚刚开学,事情还是比较多的,。我还是没课就来集训室刷题看题,感觉自己每天都有一些小进步吧,周一满课,上课完全好似一种享受,因为我能从老师的讲述中扩展出我自己的思考,不过看数论题质量不高。周二只有一节空课,去了集训室刷了一道codeforce A。。。一道题刷了整整2小时。。。补上了Atcoder的题目。周三上午看了点之前的知识,晚上打了比赛,虽然有被虐,但是我们的配合还是不错的,感觉比赛时..._中训进步周

推荐文章

热门文章

相关标签