openGL中camera类的设计以及使用

简介:

       首先,camera类是什么?它相当于摄像机镜头,通过设定合适的位置和角度可以实现对3D绘制图形的观察,而camera类的优势就在于可以围绕绘制的物体进行漫游,唯一需要完成的工作就是如何使用该类的操作完成有效的漫游。

       很多带3D图形显示的软件其实都有自己的camera类,很多时候我们可以使用鼠标即可完成3D图形的各个方向360度的观察,并且最好还可以拉近或者拉远摄像头来实现对模型的缩放功能。本章内容通过对自己近期的实践展示源自《计算机图形学》中基于openGL的一个camera类以及操作方法来实现便捷的绕物体各方位观察和缩放。

工作内容:

       使用了openGL的相关库,对书中类的函数进行的重排版实现,在QT环境中运行对已有模型进行了测试,运行效果良好。虽然是在QT中测试的,但是移植到其他环境中只要加入相关的openGL库都是没有问题的。

       本文默认你已经对camera的属性有一定了解,其中eye指的是摄像头在世界坐标系中的坐标,look指的是摄像头所望的方向的一点,up指的是摄像头上方一坐标,初始化的时候设定好这三个点,然后计算出初始的u、v、n单位三个向量。camera类可以实现的操作有平移和旋转,以摄像头为中心有上述三个两辆垂直的向量作为坐标轴,所以一共有三个平移和三个旋转操作,也就是六个自由度。roll对应的是翻滚角,yaw对应的是偏航角,pitch对应的是俯仰角。每种操作有两个方向,所以其实一共12种可能的变化。如果用键盘操作则需要12个键盘,这相当不好控制。

       所以本文使用鼠标的两个键即实现了上述功能,并具有较小局限性,具体原理将在后面介绍。下面贴出camera.h和camera.cpp的代码,其中有详细注释。

camera.h文件

#ifndef CAMERA_H
#define CAMERA_H

#include <QtOpenGL>
#include <math.h>

class Point3
{
public:
    float x,y,z;
    void set(float dx,float dy,float dz)
    {
        x=dx; y=dy; z=dz;
    }
    void set(Point3& p)
    {
        x=p.x; y=p.y; z=p.z;
    }
    Point3(float xx,float yy,float zz)
    {
        x=xx; y=yy; z=zz;
    }
    Point3()
    {
        x=y=z=0;
    }
    void build4tuple(float v[])
    {
        v[0]=x; v[1]=y; v[2]=z; v[3]=1.0f;
    }
};

class Vector3
{
public:
    float x,y,z;
    voi
  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值