一.介绍

哇!

到了传说中的3D摄像机啦!

之前我们写的东东,都是观察点不动,通过世界变换让东西动,今天,通过三维摄像机我们就能够改变我们的观察点,观察方向,任意在三维空间中驰骋。之前我们所设定的视角都是通过D3DXMatrixLookAtLH这个函数。通过几个设定好的向量,将视角初始化的。而在程序真正执行时,视角就不再改变了,而这次。我们要实时的生成视角变换矩阵,实时的改变我们的视角,我们所谓的摄像机就是这个原理。

我们通过一个类来封装摄像机,这个类基本的字段就是用四个分量:右分量(rightvector)、上分量(up vector)、观察分量(lookvector)和位置分量(position vector),来确定一个摄像机相对于世界坐标系的位置和朝向。并依据这四个分量计算出一个取景变换矩阵。然后通过取景变换(VIEWTRANSFORM)实现改变视角。

通过这些分量。我们能够确定摄像机的位置和朝向。操作有平移和旋转,那么一共就有6中操作:

(1)沿着观察分量平移(前进后退)

(2)沿着观察分量旋转(左右翻滚)

(3)沿着右分量平移(左右移动)

(4)沿着右分量旋转(朝上下看)

(5)沿着上分量平移(上下移动)

(6)沿着上分量旋转(朝左右看)

二.操作

这里,我们把摄像机的功能封装成一个类,这样,我们就能够很方便的使用摄像机的功能,而不须要写一大堆代码啦。

要用到几个函数:

(1)D3DXVec3Normalize 将向量单位化
(2)D3DXVec3Cross        叉乘,第二个,第三个參数为參加运算的向量,生成的结果为垂直与两个向量构成平面的向量,由一个參数输出结果
(3)D3DXVec3Dot  点乘,结果返回
(4)D3DXMatrixRotationAxis 创建一个绕随意轴旋转一定角度的矩阵,第一个參数为输出矩阵,第二个參数为轴,第三个參数为角度
(5)D3DXVec3TransformCoord 依据矩阵变换一个向量,第一个參数为输出向量,第二个參数为被变化向量。第三个參数为矩阵
(6)D3DXVec3Length      获得向量的长度,返回

取景变换所解决的事实上就是世界坐标系中的物体在以摄像机为中心的坐标系中怎样来表示的问题。这就是说,须要将世界坐标系中的物体随着摄像机一起进行变换,这样摄像机的坐标系就与世界坐标系全然重合了。摄像机事实上也相当于三维世界中的一个物体。和我们绘制的东西一样。

我们把摄像机移动到世界坐标系的原点,然后让右向量与世界坐标系的x方向重合。上向量与世界坐标系的y方向重合,观察向量与世界坐标系的z方向重合。这样,我们就能生成一个矩阵。

当然这个矩阵感觉比較麻烦,我们照抄下来,生成就可以。


计算取景变换矩阵的方法例如以下:
void CCamera::CalculateViewMatrix(D3DXMATRIX *pMatrix)
{
//规范化三个向量使之成为正交矩阵 //规范化观察向量
D3DXVec3Normalize(&m_vLookVector, &m_vLookVector);
//使上向量与观察向量垂直
D3DXVec3Cross(&m_vUpVector, &m_vLookVector, &m_vRightVector);
//规范化上向量
D3DXVec3Normalize(&m_vUpVector, &m_vUpVector);
//右向量与上向量垂直
D3DXVec3Cross(&m_vRightVector, &m_vUpVector, &m_vLookVector);
//规范化右向量
D3DXVec3Normalize(&m_vRightVector, &m_vRightVector); //创建取景变换矩阵
pMatrix->_11 = m_vRightVector.x;
pMatrix->_12 = m_vUpVector.x;
pMatrix->_13 = m_vLookVector.x;
pMatrix->_14 = 0.0f; pMatrix->_21 = m_vRightVector.y;
pMatrix->_22 = m_vUpVector.y;
pMatrix->_23 = m_vLookVector.y;
pMatrix->_24 = 0.0f; pMatrix->_31 = m_vRightVector.z;
pMatrix->_32 = m_vUpVector.z;
pMatrix->_33 = m_vLookVector.z;
pMatrix->_34 = 0.0f; pMatrix->_41 = -D3DXVec3Dot(&m_vRightVector, &m_vCameraPosition);
pMatrix->_42 = -D3DXVec3Dot(&m_vUpVector, &m_vCameraPosition);
pMatrix->_43 = -D3DXVec3Dot(&m_vLookVector, &m_vCameraPosition);
pMatrix->_44 = 1.0f;
}

这样,我们就能够依据摄像机类中的四个向量(相机位置,上分量。右分量,观察分量)获得取景变换的矩阵,通过指针传递參数。这样,我们实时的依据这个矩阵进行取景变换,就能够得到实时的画面情况。

而我们在逻辑部分要做的就是改变摄像机类中的各个分量就可以。


整个摄像机类的设计例如以下:

.h文件
/******************************************
posted @
2017-08-10 19:46 
yangykaifa 
阅读(...) 
评论(...) 
编辑 
收藏

Direct-X学习笔记--三维摄像机的更多相关文章

  1. GIS案例学习笔记-三维生成和可视化表达

    GIS案例学习笔记-三维生成和可视化表达 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:针对栅格或者矢量数值型数据,进行三维可视化表达 操作时间:15分钟 案 ...

  2. 【Unity 3D】学习笔记三十五:游戏实例——摄像机切换镜头

    摄像机切换镜头 在游戏中常常会切换摄像机来观察某一个游戏对象,能够说.在3D游戏开发中,摄像头的切换是不可或缺的. 这次我们学习总结下摄像机怎么切换镜头. 代码: private var Camera ...

  3. ArcGIS案例学习笔记2_2_等高线生成DEM和三维景观动画

    ArcGIS案例学习笔记2_2_等高线生成DEM和三维景观动画 计划时间:第二天下午 教程:Pdf/405 数据:ch9/ex3 方法: 1. 创建DEM SA工具箱/插值分析/地形转栅格 2. 生成 ...

  4. ArcGIS案例学习笔记4_2_城乡规划容积率计算和建筑景观三维动画

    ArcGIS案例学习笔记4_2_城乡规划容积率计算和建筑景观三维动画 概述 计划时间:第4天下午 目的:城市规划容积率计算和建筑三维景观动画 教程: pdf page578 数据:实验数据\Chp13 ...

  5. tensorflow拟合随机生成的三维数据【学习笔记】

    平台信息:PC:ubuntu18.04.i5.anaconda2.cuda9.0.cudnn7.0.5.tensorflow1.10.GTX1060 作者:庄泽彬(欢迎转载,请注明作者) 说明:感谢t ...

  6. OpenGL ES学习笔记(二)——平滑着色、自适应宽高及三维图像生成

    首先申明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. <Android学习笔记--O ...

  7. 机器视觉学习笔记(5)——基于OpenCV的单目摄像机标定

    本文CameraCalibrator类源代码来自于OpenCV2 计算机视觉编程手册(Robert Laganiere 著 张静 译) 强烈建议阅读机器视觉学习笔记(4)--单目摄像机标定参数说明之后 ...

  8. matlab学习笔记8 基本绘图命令-三维绘图

    一起来学matlab-matlab学习笔记8 基本绘图命令_6 三维绘图 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 ...

  9. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引 代码工程地址: https://g ...

随机推荐

  1. MVC 之 <%%>相关内联代码块用法

    1.<%@ ... %> 添加引用; 2.<% ... %> <%%>之间可以执行服务端代码,如<% foreach (DataRow dataRow in ...

  2. 如何不使用pthread_cancel而杀死线程

    http://www.cnblogs.com/no7dw/archive/2012/09/27/2705847.html During the time I use standalone cross ...

  3. uva 11181 - Probability|Given(概率)

    题目链接:uva 11181 - Probability|Given 题目大意:有n个人去超市买东西,给出r,每个人买东西的概率是p[i],当有r个人买东西的时候,第i个人恰好买东西的概率. 解题思路 ...

  4. webpack打包过滤console.log

    在webpack.prod.conf.js里面的plugins里面加上 drop_debugger: true, drop_console: true new webpack.optimize.Ugl ...

  5. JDK目录结构和文件作用介绍

    要想深入了解Java必须对JDK的组成, 本文对JDK6里的目录做了基本的介绍,主要还是讲解了下JDK里的各种可执行程序或工具的用途Java(TM) 有两个平台 JRE 运行平台,包括Java虚拟机, ...

  6. Linux Bash 脚本:自己定义延迟代码块(裸数据保存方案)

    结合 alias 和 read 使用方法.能够保存一些将要延迟执行的脚本,或者裸数据(字符串不被扩展)到一个变量中.以备后用. $ alias BEGIN='read -d "" ...

  7. 算法笔记_210:第六届蓝桥杯软件类决赛真题(Java语言C组)

    目录 1 机器人数目 2 生成回文数 3 空心菱形 4 奇怪的数列 5 密文搜索 6 居民集会 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 机器人数目 标题:机器人数目 少年宫新近邮购了小机器人 ...

  8. MVC MVP MVVM 图解

    1.MVC (1)图解 解释: 视图(View):用户界面. 控制器(Controller):业务逻辑 模型(Model):数据保存 各部分之间的通信方式如下: View 传送指令到 Controll ...

  9. JNI 在命令行窗口输入字符,不显所输入字符,显指定的掩饰符

    //JNI-命令行窗口输入字符,显掩饰符.txt /*  目标:在命令行窗口输入字符,不显所输入字符,显指定的掩饰符  作者:tangshancheng@21cn.com*/ 1.KeyBoard.j ...

  10. Redis批量查询删除KEYS

    对腾讯云的Redis集群不支持很多指令(config get * .flushdb.flushall.等相关指令) redis指令限制:https://www.qcloud.com/document/ ...