cameraclass是一个相机类,它的作用是生成非常重要的观察矩阵。本小节涉及到一点数学知识,相对前面需要只是填充,调用,算是比较有趣的吧。

cameraclass.h

 #pragma once
#include <d3d11.h>
#include <d3dcompiler.h>
#include <D3DX11.h>
#include <xnamath.h> #pragma comment(lib,"d3dx11.lib")
#pragma comment(lib,"d3d11.lib")
#pragma comment(lib,"d3dcompiler.lib") class cameraclass
{
public:
cameraclass();
~cameraclass(); private:
XMMATRIX m_viewMatrix;
XMVECTOR m_eye;
XMVECTOR m_at;
XMVECTOR m_up; public:
void Getviewmatrix(XMMATRIX& viewMatrix);
void SetPositon(float x, float y, float z);
void SetTarget(float x, float y, float z);
void SetRotation(float x, float y, float z);
void Setfar_near(float d);
};

向量m_eye,m_up,m_at分别是相机位置(向量类型也可以作为位置),相机向上的方向在世界坐标的表示,观察的目标的位置。用这些就能最终生成观察矩阵。

这里只讲两个函数SetRotation()和Setfar_near()。其他的都很简单。

SetRotation()是设置相机俯仰角,偏航角,翻滚角。即使向量CT绕x,y,z(红色)旋转。

Setfar_near()是设置相机与自己看到的目标的距离的函数。即设置C点往CT方向做正负平移。

camera.cpp

 #include "cameraclass.h"

 cameraclass::cameraclass()
{
m_eye = XMVectorSet(, , -, );
m_at = XMVectorSet(, , , );
m_up = XMVectorSet(, , , );
} cameraclass::~cameraclass()
{
} void cameraclass::Getviewmatrix(XMMATRIX& viewMatrix)
{
m_viewMatrix = XMMatrixLookAtLH(m_eye, m_at, m_up);
viewMatrix = m_viewMatrix;
} void cameraclass::SetPositon(float x, float y, float z)
{
m_eye = XMVectorSet(x, y, z, );
} void cameraclass::SetTarget(float x, float y, float z)
{
m_at = XMVectorSet(x, y, z, );
} void cameraclass::SetRotation(float x, float y, float z)
{
XMMATRIX Matrix; Matrix = XMMatrixLookAtLH(m_eye, m_at, m_up);
Matrix *= XMMatrixRotationRollPitchYaw(x, y, z); XMVECTOR v = m_at - m_eye;
m_at = XMVector3TransformNormal(v, Matrix);
} void cameraclass::Setfar_near(float d)
{
XMVECTOR v, u, w;
v = m_at - m_eye;
w = XMVector3Normalize(v);
u = w*-d;
v += u;
m_eye = m_at - v;
}

SetRotation():

  • 根据当前的相机位置,目标位置,向上向量得到当前的观察矩阵
  • 再将当前的观察矩阵乘以旋转矩阵得到平移到相机位置后的旋转矩阵
  • 将目标位置减去相机位置得到CT向量
  • CT向量乘以旋转矩阵得到新的CT’向量
  • CT'向量就是新的相机观察点向量,所以观察点的位置也可以用CT‘向量表示

Setfar_near():

  • 获取CT向量并用v表示
  • 获取v向量的单位向量w
  • 将单位向量乘以移动的距离得到平移向量u
  • 将v加上u得到新的CT向量
  • 目标位置减去新的CT向量即是相机的位置

Getviewmatrix()

将处理好的相机位置,观察目标位置并相机向上向量作为输入,调用dx11API就得到观察矩阵。

本小节所做的东西很少,也就是一个很简单的例子。平时工作中会因为各种需求而计算观察矩阵,我们可以根据需求做相应的变换。不过在图形学里,这种需求一般不多。更多的是对模型,颜色,材质,世界空间的设计和探索

C++小项目:directx11图形程序(六):cameraclass的更多相关文章

  1. C++小项目:directx11图形程序(一):主框架

    最近在学习DIRECTX11,在学习过程中编写了一个程序,到现在发现这个程序也有几行代码了,结构还算整齐,就想把这个程序分享出来,其中涉及到了C++程序的架构,windows窗口程序编写,和Direc ...

  2. C++小项目:directx11图形程序(四):d3dclass

    主菜终于来了.这个d3dclass主要做的工作是dx11图形程序的初始化工作,它将创建显示表面交换链,d3d设备,d3d设备上下文,渲染目标表面,深度模板缓存:设置视口,生成投影矩阵. D3D设备:可 ...

  3. C++小项目:directx11图形程序(三):graphicsclass

    这是框架的第三层graphicsclass,这个类才真正可以说是整个程序的框架,因为它组织了后面所有的成员. 代码: graphicsclass.h #pragma once #include< ...

  4. C++小项目:directx11图形程序(九):总结

    整篇文章中对于directx11的知识的介绍并不多,我也不知道怎么介绍,也应该说对于directx,它有它自己的部分,比如设备(device),设备上下文(devicecontext),顶点缓存,索引 ...

  5. C++小项目:directx11图形程序(八):particleSysclass

    粒子系统类,粒子系统是游戏里细小元素的控制系统,虽然感觉上它对游戏的影响不大,但是其实有了它能给游戏增色不少.粒子系统控制着细小元素的生死,运动,纹理.对它的编写让我知道,游戏里的这一片从天空飘落的雪 ...

  6. C++小项目:directx11图形程序(七):modelclass

    模型类是世界空间中的表示物体的类,那么他的所做的事就是加载模型,移动模型,渲染模型 modelclass.h #pragma once #include <d3d11.h> #includ ...

  7. C++小项目:directx11图形程序(二):systemclass

    先上代码: systemclass.h #pragma once #include"graphicsclass.h" const bool FULLSCREEN = true; c ...

  8. C++小项目:directx11图形程序(五):shadersclass

    这个类是用来创建着色器并设置输入布局的. 这个类比较特殊,它创建的着色器与Effect文件有关,effect文件是用高级着色语言(hlsl)编写的. shadersclass.h #pragma on ...

  9. Android小项目之七 应用程序的更新安装

    ------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...

随机推荐

  1. javascriptの循序渐进(一)

    javascriptの循序渐进系列为<javascript高级程序设计>的读书笔记,记录了看书过程中觉得重点的地方和一些总结,为学习javascript打好基础. ------------ ...

  2. python走起之第九话

    协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来 ...

  3. 《C++ Primer》学习笔记【第三部分 类设计者的工具】

    第13章 拷贝控制 使用default:=defult只能修饰默认构造函数或拷贝控制成员,显式地要去编译器生成合成的版本. 使用delete:=delete通知编译器不希望定义这些成员,禁止试图使用它 ...

  4. Java多线程总结之线程安全队列Queue

    在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非 ...

  5. Ioc

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  6. Android获取网络图片

    /** * * 访问网络的操作,必须放在工作线程中完成 * */ public class MainActivity extends Activity { static List<HashMap ...

  7. python实现查看目录下重复的文件

    该python 脚本有以下三个功能: 1. 实现查看目录下重复的文件,输出文件按修改时间升序排列 2. 将按修改时间排列比较旧的.可删除的文件列出来 3. 按目录对重复文件进行统计,比如,目录/tmp ...

  8. MemCache缓存multiget hole详解

    multiget 是什么 multiget 指的是从 memcache(或其他分布式缓存) 一次性获得多个键值,一般由 memcached client 自行实现. multiget hole是什么 ...

  9. 数据库DDL审计

    一.为什么需要数据库DDL审计? DDL在生产系统中扮演非常重要的作用. 1)首先从业务角度来说,DDL可能意味着表结构变更,意味着新的版本即将发布,是个重要的时刻. 2)其次从运维角度来说,DDL尤 ...

  10. 基于Red5的视频直播平台

    搭建环境:Win2008 server + jdk1.8+red5-server-1.0.6 下载地址:https://github.com/Red5 修改启动配置文件(修改为jdk路径): 安装模版 ...