DirectX11 学习笔记7 - 支持自由移动的摄像机

如今将又一次制定一个camera摄像机。能够自由移动。

比方前进 后退,上游 下潜。 各个方向渲染之类的。

首先设置按键。

这个时候须要在

XWindow.h 里面

bool XWindow::frame()
{//推断是否按下ESC键if(x_input->isKeyDown(VK_ESCAPE))return false;//假设A,S,D,W,Q,E,Z,X,C键按下。移动摄像机 if(GetAsyncKeyState('W') & 0x8000)    //前后 x_graphics->x_camera->walk(-0.1f); if(GetAsyncKeyState('S') & 0x8000)    x_graphics->x_camera->walk(0.1f); if(GetAsyncKeyState('A') & 0x8000)    //左右 x_graphics->x_camera->strafe(-0.1f); if(GetAsyncKeyState('D') & 0x8000)    x_graphics->x_camera->strafe(0.1f); //if(GetAsyncKeyState('Q') & 0x8000)    //上下 //	x_graphics->x_camera->fly(-0.1f); //if(GetAsyncKeyState('E') & 0x8000)    //	x_graphics->x_camera->fly(0.1f); //if(GetAsyncKeyState('Z') & 0x8000)    //	x_graphics->x_camera->pitch(PI/180); //if(GetAsyncKeyState('X') & 0x8000)    //	x_graphics->x_camera->yaw(PI/180); //if(GetAsyncKeyState('C') & 0x8000)    //	x_graphics->x_camera->roll(PI/180);//动画。旋转摄像机 //x_graphics->x_camera->roll(PI/180);//開始渲染return x_graphics->frame();
}
加入一些按键。假设报错的话, 可能是x_camera 在XGraphics.h 类里面是私有的,能够设置成公有

private: bool render(); 
public:XCamera *x_camera;//摄像机
private:XD3Device *x_d3d;//3D设备XModel *x_model;//模型XShader *x_shader;//渲染器HWND hwnd;


然后非常easy吧

然后就是改动摄像机了

先上代码再解说吧

#pragma once
#include <xnamath.h>
class XCamera
{
public:enum CameraType { LANDOBJECT, AIRCRAFT };XCamera();void strafe(float units); // l左右//void fly(float units);    // 上下void walk(float units);   // 前后//void pitch(float angle); // 旋转view坐标系right向量//void yaw(float angle);   // 旋转up向量//void roll(float angle);  // 旋转look向量void getViewMatrix(XMMATRIX& V); void setCameraType(CameraType cameraType); void getPosition(XMFLOAT3* pos); void setPosition(XMFLOAT3* pos); void getRight(XMFLOAT3* right);void getUp(XMFLOAT3* up);void getLook(XMFLOAT3* look);
private:CameraType _cameraType;XMFLOAT3 _right,_up,_look,_pos;
};
XCamera::XCamera()
{_cameraType=AIRCRAFT;_pos=XMFLOAT3(0.0f, 0.0f, -10.0f);_right=XMFLOAT3(1.0f,0.0f,0.0f);_up=XMFLOAT3(0.0f,1.0f,0.0f);_look=XMFLOAT3(0.0f,0.0f,1.0f);
}
void XCamera::getPosition(XMFLOAT3* pos)
{*pos = _pos;
}void XCamera::setPosition(XMFLOAT3* pos)
{_pos = *pos;
}void XCamera::getRight(XMFLOAT3* right)
{*right = _right;
}void XCamera::getUp(XMFLOAT3* up)
{*up = _up;
}void XCamera::getLook(XMFLOAT3* look)
{*look = _look;
}//行走,沿着摄像机观察方向的移动
void XCamera::walk(float units)
{XMVECTOR vpos,vlook;vpos=XMLoadFloat3(&_pos);vlook=XMLoadFloat3(&_look);// 仅在x,z平面移动if( _cameraType == LANDOBJECT ){vpos += XMVectorSet(_look.x, 0.0f, _look.z,0)*units;}if( _cameraType == AIRCRAFT )vpos += vlook * units;XMStoreFloat3(&_pos,vpos);
}//扫视。是指保持观察方向不变,沿向量right方向从一边平移到还有一边
void XCamera::strafe(float units)
{XMVECTOR vpos,vright;vpos=XMLoadFloat3(&_pos);vright=XMLoadFloat3(&_right);// 仅在x,z平面移动if( _cameraType == LANDOBJECT )vpos += XMVectorSet(_right.x, 0.0f, _right.z,0.0f) * units;if( _cameraType == AIRCRAFT )vpos += vright * units;XMStoreFloat3(&_pos,vpos);
}/*
//飞行模式,升降,指沿着向量up方向的移动
void XCamera::fly(float units)
{// 仅在y轴移动if( _cameraType == LANDOBJECT )_pos.y += units;if( _cameraType == AIRCRAFT )_pos += _up * units;
}void XCamera::pitch(float angle)
{XMMATRIX T;T=XMMatrixRotationAxis( _right, angle);// 绕着right向量。旋转up和look_up=XMVector3TransformCoord(_up,_up, T);_look=XMVector3TransformCoord(_look, T);
}void XCamera::yaw(float angle)
{D3DXMATRIX T;//对LANDOBJECT,总是绕着(0,1,0)旋转。

if( _cameraType == LANDOBJECT ) T=XMMatrixRotationY(angle); //对于aircraft,绕着up向量旋转 if( _cameraType == AIRCRAFT ) T=XMMatrixRotationAxis(_up, angle); // 绕着up或者y轴,旋转right和look _right=XMVector3TransformCoord(_right, T); _look=XMVector3TransformCoord(_look, T); } void XCamera::roll(float angle) { //仅仅对aircraft模式才左roll旋转 if( _cameraType == AIRCRAFT ) { D3DXMATRIX T; T=XMMatrixRotationAxis(_look, angle); // 绕着look向量,旋转up和right _right=XMVector3TransformCoord(_right, T); _up=XMVector3TransformCoord(_up, T); } } */ void XCamera::getViewMatrix(XMMATRIX &V) { XMVECTOR vlook,vup,vright,vpos; vpos=XMLoadFloat3(&_pos); vlook=XMLoadFloat3(&_look); vup=XMLoadFloat3(&_up); vright=XMLoadFloat3(&_right); // 保持view局部坐标系,各轴的彼此正交 vlook=XMVector3Normalize(vlook); // look X right vup=XMVector3Cross(vlook, vright); vup=XMVector3Normalize(vup); vright=XMVector3Cross(vup, vlook); vright=XMVector3Normalize(vright); V=XMMatrixLookAtLH( vpos,vlook, vup); // 生成view矩阵: //float x = -D3DXVec3Dot(&_right, &_pos); //float y = -D3DXVec3Dot(&_up, &_pos); //float z = -D3DXVec3Dot(&_look, &_pos); //(*V)(0,0) = _right.x; (*V)(0, 1) = _up.x; (*V)(0, 2) = _look.x; (*V)(0, 3) = 0.0f; //(*V)(1,0) = _right.y; (*V)(1, 1) = _up.y; (*V)(1, 2) = _look.y; (*V)(1, 3) = 0.0f; //(*V)(2,0) = _right.z; (*V)(2, 1) = _up.z; (*V)(2, 2) = _look.z; (*V)(2, 3) = 0.0f; //(*V)(3,0) = x; (*V)(3, 1) = y; (*V)(3, 2) = z; (*V)(3, 3) = 1.0f; } void XCamera::setCameraType(CameraType cameraType) { _cameraType = cameraType; }


凝视掉的地方是一个坑。为什么呢。

以下就要讲XMVECTOR 和XMFloat3的差别

前者是向量。后者就是一个点结构

前者支持各种运算。

差 点  乘 加减

后者 仅仅能赋值啊什么的。

是不是特别奇怪。

由于XMVECTOR

看源代码

// Vector intrinsic: Four 32 bit floating point components aligned on a 16 byte 
// boundary and mapped to hardware vector registers
#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_)
typedef __m128 XMVECTOR;
#else

128位懂了吧。不能随便玩, 不然会报错 涉及到对齐问题

上节说了。全局变量和局部变量能够用XMVECTOR 可是类变量不建议用

偏偏这个摄像机是类变量。

作死啊。仅仅有设成XMFloat3了

看源代码

// 3D Vector; 32 bit floating point components
typedef struct _XMFLOAT3
{FLOAT x;FLOAT y;FLOAT z;#ifdef __cplusplus_XMFLOAT3() {};_XMFLOAT3(FLOAT _x, FLOAT _y, FLOAT _z) : x(_x), y(_y), z(_z) {};_XMFLOAT3(CONST FLOAT *pArray);_XMFLOAT3& operator= (CONST _XMFLOAT3& Float3);#endif // __cplusplus

32位的 仅仅能赋值 怎么玩 怎么玩 

上面摄像机类加凝视了的函数是之前悲剧了的,我以为Float能够做运算。结果悲剧了。

后来查了一下。 能够用一个转换

XMVECTOR vpos,vright;vpos=XMLoadFloat3(&_pos);vright=XMLoadFloat3(&_right);// 仅在x,z平面移动if( _cameraType == LANDOBJECT )vpos += XMVectorSet(_right.x, 0.0f, _right.z,0.0f) * units;if( _cameraType == AIRCRAFT )vpos += vright * units;XMStoreFloat3(&_pos,vpos);

看懂了吗 看懂了吗。 先load 把float装到vector局部变量  然后进行运算

运算完毕后  再store 

是不是非常烦

是不是

没办法。

眼下我仅仅会这样弄。你嫌烦 直接全局变量吧。

或者回归dx10math.h 

废话不说 效果图。

仅仅改了walk函数。 其它自己改改吧,锻炼下自己

//(*V)(0,0) = _right.x; (*V)(0, 1) = _up.x; (*V)(0, 2) = _look.x; (*V)(0, 3) = 0.0f;//(*V)(1,0) = _right.y; (*V)(1, 1) = _up.y; (*V)(1, 2) = _look.y; (*V)(1, 3) = 0.0f;//(*V)(2,0) = _right.z; (*V)(2, 1) = _up.z; (*V)(2, 2) = _look.z; (*V)(2, 3) = 0.0f;//(*V)(3,0) = x;        (*V)(3, 1) = y;     (*V)(3, 2) = z;       (*V)(3, 3) = 1.0f;

对了还有上面这个。原教程是直接这样算的一个矩阵,麻烦吧。

麻烦吧。 懂不起含义了吧 快看龙书就懂了。

懂了之后怎么办。还敲这么多??

V=XMMatrixLookAtLH( vpos,vlook, vup);

一句话搞定。就不要造轮子了

转载于:https://www.cnblogs.com/jhcelue/p/7141917.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯吃鸡 android,腾讯吃鸡手游《光荣使命》正式上线:安卓/iOS不限号测试

IT之家11月29日消息 今天下午&#xff0c;腾讯首款百人战术竞技手游《光荣使命》在安卓、iOS双平台正式上线&#xff0c;开启全面测试。(官网下载&#xff1a;点此链接&#xff0c;双平台已开放下载。)该游戏采用第三人称射击视角&#xff0c;玩家化身参与“使命行动”军事演习…

lazada铺货模式的选品_lazada小白的运营难点→铺货与精细化运营的优劣势详解

lazada是铺货还是精细化经营第一种铺货铺货作为平台早期都是比较受欢迎的&#xff0c;平台的蛮荒期&#xff0c;成长期当中&#xff0c;铺货的商家是非常受欢迎的&#xff0c;因为平台需要更多SKU产品&#xff0c;去吸引买家&#xff0c;铺货这个时候是最好的也是能最快的成长起…

excel数据生成sql insert语句

excel数据生成sql insert语句 excel表格中有A、B、C三列数据&#xff0c;希望导入到数据库users表中&#xff0c;对应的字段分别是name,sex,age 。 在你的excel表格中增加一列&#xff0c;利用excel的公式自动生成sql语句&#xff0c;方法如下&#xff1a; 1、增加一列&#xf…

重载,覆盖,隐藏

转载于:https://www.cnblogs.com/jhcelue/p/7145525.html

荣耀鸿蒙系统开机动画,荣耀赵明:鸿蒙系统首发设备欲屏蔽开机广告

来源&#xff1a;硅谷分析狮余承东表示8月9日会发布鸿蒙系统&#xff0c;而从他透露的一些细节看&#xff0c;鸿蒙系统将首先运用在智慧屏终端上&#xff0c;其配合大屏幕和自研芯片(麒麟AI芯片&#xff0c;鸿鹄智慧显示芯片&#xff0c;凌霄WIFI芯片)&#xff0c;将实现生态上…

Hamcrest包含匹配器

与Hamcrest 1.2相比 &#xff0c;针对Matchers类的Hamcrest 1.3 Javadoc文档为该类的几种方法添加了更多文档。 例如&#xff0c;四个重载的contains方法具有更具描述性的Javadoc文档&#xff0c;如下面所示的两个比较屏幕快照所示。 尽管仅通过尝试就可以弄清楚“包含”匹配器…

函数 (四) 迭代器和生成器

一 迭代器 一 迭代的概念 #迭代器即迭代的工具&#xff0c;那什么是迭代呢&#xff1f;#迭代是一个重复的过程&#xff0c;每次重复即一次迭代&#xff0c;并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复&#xff0c;因而不是迭代print(>) l[1,2,3]…

进阶-JMS 知识梳理

JMS 一、 概述与介绍 ActiveMQ 是Apache出品&#xff0c;最流行的、功能强大的即时通讯和集成模式的开源服务器。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。提供客户端支持跨语言和协议&#xff0c;带有易于在充分支持JMS 1.1和1.4使用J2EE企业集成模式…

android蓝牙pair,Android向更多蓝牙设备开放Fast Pair功能 配对更轻松了

原标题&#xff1a;Android向更多蓝牙设备开放Fast Pair功能 配对更轻松了 来源&#xff1a;cnBeta.COM蓝牙是一项应用非常广泛的无线技术&#xff0c;在无线音频配件、智能手表和智能家电中都广泛使用。不过蓝牙设备的配对体验并不优秀&#xff0c;而且无法实现跨平台的一致性…

python绘制帕累托图

python绘制帕累托图代码 1 import pandas as pd2 import matplotlib.pyplot as plt3 plt.rcParams[font.sans-serif][SimHei]#表示可以显示中文4 plt.rcParams[axes.unicode_minus]False#表示可以正常显示正负号5 datapd.read_csv(catering_dish_profit.csv,index_coltype)6 pr…

html5 测评游戏,暗黑之王评测:HTML5游戏铸就最华丽ARPG冒险

由白鹭时代(Egret Technology)与比悦科技联手推出的重度大型HTML5游戏《暗黑之王》&#xff0c;一款典型的ARPG手游&#xff0c;其HTML5版本推出以来&#xff0c;获得了来自业界、玩家和媒体的大量关注。其丰富的游戏内容和玩法&#xff0c;加上卓越的游戏性能表现&#xff0c;…

搞定flex布局

这几种方式的搭配使用可以轻松搞定 PC 端页面的常见需求&#xff0c;比如实现水平居中可以使用 margin: 0 auto&#xff0c;实现水平垂直同时居中可以如下设置&#xff1a;.dad {position: relative; } .son {position: absolute;margin: auto;top: 0;right: 0;bottom: 0;left…

Fiddler抓包使用教程-QuickExec

转载请标明出处&#xff1a;http://blog.csdn.net/zhaoyanjun6/article/details/73468287 本文出自【赵彦军的博客】 在 Fiddler 中自带了一个 QuickExec 命令行&#xff0c;用户可以直接输入并快速执行脚本命令。 常见命令 help 打开官方的使用页面介绍&#xff0c;所有的命令…

html5与css3都要学吗,前端要学css3吗?

前端要学css3&#xff1b;HTML5、CSS3是前端工程师必须要学会。现在移动端的兴起&#xff0c;导致web前端开发的技术逐变向css3和html5转变&#xff0c;所以css3一定要学。CSS3是CSS(层叠样式表)技术的升级版本&#xff0c;于1999年开始制订&#xff0c;2001年5月23日W3C完成了…

react 判断图片是否加载完成_React中型项目的优化实践

项目介绍整个项目大概有60个页面&#xff0c;用到的组件大概150&#xff0c;package里面的依赖大概有70个&#xff0c;应该勉强算得上是一个中型的React的项目了。下面给大家看看我们现在build一次项目的结果--打包时间约150s&#xff0c;打包完之后的资源gzip之后约1.2m&#…

搭建本地wordpress

1.首先&#xff0c;下载xampp&#xff0c;安装按默认勾选即可。 2.安装完成后&#xff0c;启动Apache和MySQL这两个服务。 启动后变成绿色&#xff0c;表示启动成功。 3.点击MySQL项的Admin进入数据库后台。 4.点击用户账户新建用户。 5.填写用户名&#xff0c;host name选本地…

Python基础【day02】:字符串(四)

在Python中字符串本身有带很多操作&#xff0c;字符串的特性&#xff0c;不可以被修改 0、字符串常用功能汇总 1、字符串的定义 #定义空字符串>>> name#定义非空字符串 >>> name"luoahong"#通过下标访问 >>> name[1] u#不能修改字符串的值…

html5 窗口变形,HTML5画布(变形)

坐标变换案例1&#xff1a;function draw(){var cdocument.getElementById("myCanvas");var cxt c.getContext("2d");cxt.translate(200,50);cxt.fillStylergba(255,0,0,0.25);for(var i0;i<40;i){cxt.translate(25,25);cxt.scale(0.9,0.9);cxt.rotate(…

appium GUI介绍

Appium作为APP端的自动化测试工具&#xff0c;具有很多的有点&#xff0c;今天主要介绍一下它的UI界面&#xff0c;包含其中的一些参数等。主要说的是windows下的APPIUM GUI。 先看一眼它的界面(版本为1.4.16.1) 注: 1.android Settings - Android设置按钮&#xff0c;所有和安…

迭代器模式和Java

大家好&#xff0c;在本文中&#xff0c;我们将检查Iterator Pattern 。 我知道你们中许多人已经使用过一种设计模式&#xff0c;但是也许您没有意识到它是模式&#xff0c;或者不知道它的巨大价值。 根据《 Head First Design 》一书&#xff1a; 迭代器模式提供了一种在不暴…