简介:
首先,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