一.介绍

哇!

到了传说中的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. leetcode Wildcard Matching greedy algrithm

    The recursive program will result in TLE like this: class Solution { public: bool isMatch(const char ...

  2. Java从零开始学零(Java简介)

    一.Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共同研发,并在1995年 ...

  3. 转:Tkinter教程之Text(2)篇

    '''Tkinter教程之Text(2)篇''''''6.使用tag来指定文本的属性'''#创建一个指定背景颜色的TAG# -*- coding: cp936 -*-from Tkinter impo ...

  4. ecipse theme

    市场里搜“jeeeyul's Eclipse Themes”

  5. java 时间戳和PHP时间戳 的转换[10位和13位]

    2013-08-02 14:06 9826人阅读 评论(2) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载. 总结一下java 时间戳和PHP时间戳 的转换问题:  由于精度不同,导 ...

  6. java 和 C 代码运行效率的比较(整理)

    最近和朋友无意间讨论起了 有关java 和C 的 效率问题, (我是java 推介者, 他是 c 语言推介者, 他做的是嵌入式) 故,想通过网络查询一下, 总结一下,两者到底效率如何,其有何差异,原因 ...

  7. 快速搭建Seeddms文档管理系统

    Seddms文档管理系统是开源的 环境: Redhat6.5 lamp 01.LAMP的安装 安装请看:http://www.cnblogs.com/xiaochina/p/6442337.html ...

  8. python标准日志模块logging的使用方法

    参考地址 最近写一个爬虫系统,需要用到python的日志记录模块,于是便学习了一下.python的标准库里的日志系统从Python2.3开始支持.只要import logging这个模块即可使用.如果 ...

  9. JavaScript-实现滚动条

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. 配置eclipse插件

    http://blog.csdn.net/zhangyabinsky/article/details/7043435