Direct-X学习笔记--三维摄像机
一.介绍
哇!
到了传说中的3D摄像机啦!
之前我们写的东东,都是观察点不动,通过世界变换让东西动,今天,通过三维摄像机我们就能够改变我们的观察点,观察方向,任意在三维空间中驰骋。之前我们所设定的视角都是通过D3DXMatrixLookAtLH这个函数。通过几个设定好的向量,将视角初始化的。而在程序真正执行时,视角就不再改变了,而这次。我们要实时的生成视角变换矩阵,实时的改变我们的视角,我们所谓的摄像机就是这个原理。
我们通过一个类来封装摄像机,这个类基本的字段就是用四个分量:右分量(rightvector)、上分量(up vector)、观察分量(lookvector)和位置分量(position vector),来确定一个摄像机相对于世界坐标系的位置和朝向。并依据这四个分量计算出一个取景变换矩阵。然后通过取景变换(VIEWTRANSFORM)实现改变视角。
通过这些分量。我们能够确定摄像机的位置和朝向。操作有平移和旋转,那么一共就有6中操作:
(1)沿着观察分量平移(前进后退)
(2)沿着观察分量旋转(左右翻滚)
(3)沿着右分量平移(左右移动)
(4)沿着右分量旋转(朝上下看)
(5)沿着上分量平移(上下移动)
(6)沿着上分量旋转(朝左右看)
二.操作
我们把摄像机移动到世界坐标系的原点,然后让右向量与世界坐标系的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;
}
这样,我们就能够依据摄像机类中的四个向量(相机位置,上分量。右分量,观察分量)获得取景变换的矩阵,通过指针传递參数。这样,我们实时的依据这个矩阵进行取景变换,就能够得到实时的画面情况。
而我们在逻辑部分要做的就是改变摄像机类中的各个分量就可以。
/******************************************
Direct-X学习笔记--三维摄像机的更多相关文章
- GIS案例学习笔记-三维生成和可视化表达
GIS案例学习笔记-三维生成和可视化表达 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:针对栅格或者矢量数值型数据,进行三维可视化表达 操作时间:15分钟 案 ...
- 【Unity 3D】学习笔记三十五:游戏实例——摄像机切换镜头
摄像机切换镜头 在游戏中常常会切换摄像机来观察某一个游戏对象,能够说.在3D游戏开发中,摄像头的切换是不可或缺的. 这次我们学习总结下摄像机怎么切换镜头. 代码: private var Camera ...
- ArcGIS案例学习笔记2_2_等高线生成DEM和三维景观动画
ArcGIS案例学习笔记2_2_等高线生成DEM和三维景观动画 计划时间:第二天下午 教程:Pdf/405 数据:ch9/ex3 方法: 1. 创建DEM SA工具箱/插值分析/地形转栅格 2. 生成 ...
- ArcGIS案例学习笔记4_2_城乡规划容积率计算和建筑景观三维动画
ArcGIS案例学习笔记4_2_城乡规划容积率计算和建筑景观三维动画 概述 计划时间:第4天下午 目的:城市规划容积率计算和建筑三维景观动画 教程: pdf page578 数据:实验数据\Chp13 ...
- tensorflow拟合随机生成的三维数据【学习笔记】
平台信息:PC:ubuntu18.04.i5.anaconda2.cuda9.0.cudnn7.0.5.tensorflow1.10.GTX1060 作者:庄泽彬(欢迎转载,请注明作者) 说明:感谢t ...
- OpenGL ES学习笔记(二)——平滑着色、自适应宽高及三维图像生成
首先申明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. <Android学习笔记--O ...
- 机器视觉学习笔记(5)——基于OpenCV的单目摄像机标定
本文CameraCalibrator类源代码来自于OpenCV2 计算机视觉编程手册(Robert Laganiere 著 张静 译) 强烈建议阅读机器视觉学习笔记(4)--单目摄像机标定参数说明之后 ...
- matlab学习笔记8 基本绘图命令-三维绘图
一起来学matlab-matlab学习笔记8 基本绘图命令_6 三维绘图 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引 代码工程地址: https://g ...
随机推荐
- 关于ARM立即数的理解
转自:http://blog.sina.com.cn/s/blog_9bad4f090101e14d.html 一.立即数指令码的组成 ARM公司将32bit指令码分为如下两部分: 32bit立即数通 ...
- Linux内核中网络数据包的接收-第一部分 概念和框架
与网络数据包的发送不同,网络收包是异步的的.由于你不确定谁会在什么时候突然发一个网络包给你.因此这个网络收包逻辑事实上包括两件事:1.数据包到来后的通知2.收到通知并从数据包中获取数据这两件事发生在协 ...
- 1z0-052 q209_2
2: View the Exhibit to examine the output produced by the following query at three different times s ...
- 【DB2】db2常用SQL语句集合
持续更新中 1.修改日志模式为不记录 alter table table_name activate not logged initially; 2.清空表 alter table t1 activ ...
- 用C/C++开发android应用
在某些情况下,比如原来与很多c/c++的代码, 可能希望采用c/c++编写android应用程序.在这种情况下,一般使用NDK.但是由于android直提供了java接口,因此不能够直接调用andro ...
- 利用cURL会话获取一个网页
1.curl_init 作用: 初始化一个新的会话.返回一个cURL句柄,供curl_setopt(), curl_exec()和curl_close() 函数使用. 格式: curl_ ...
- JPA实体继承实体的映射策略
注:这里所说的实体指的是@Entity注解的类 继承映射使用@Inheritance来注解.它的strategy属性的取值由枚举InheritanceType来定义(包含SINGLE_TABLE.TA ...
- 分享一个php代码创建目录的Demo
/* * 连续建目录 * string $dir 目录字符串 * int $mode 权限数字 * 返回:顺利创建或者全部已建返回true,其它方式返回false */ function makeDi ...
- JS操作frame框架
1 框架编程概述 一个Html 页面可以有一个或多个子框架,这些子框架以<iframe>来标记,用来显示一 个独立的Html 页面.这里所讲的框架编程包括框架的自我控制以及框架之间的互相访 ...
- Megcup 2017 决赛第一题 规则
2017Megcup 2017Megcup决赛第三题题解 只做出了一道题,虽然慢慢地退出了前128名,但还是要记录一下. 10点钟开始,一看第一题很熟悉,因为研究过格点图中电流问题,其实就是求解线性方 ...