• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >游戏开发 > 项目代码中,诡异的摄像机,希望能够将摄像机按照现在的视线水平移动,求解

项目代码中,诡异的摄像机,希望能够将摄像机按照现在的视线水平移动,求解

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-05

佚名通过本文主要向大家介绍了项目代码中,诡异的摄像机,希望能够将摄像机按照现在的视线水平移动,求解等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 项目代码中,诡异的摄像机,希望能够将摄像机按照现在的视线水平移动,求解
描述:

本帖最后由 wuanshi5 于 2015-12-10 11:42:34 编辑

Directx游戏开发PCC++

最近项目里面有一个需求,希望能够将摄像机按照当前的视线向左或者向右移动。 若是正常的摄像机设置只需要更改摄像机的眼睛位置即可了,项目中使用的是第三人称摄像机。但是,我们项目中使用的摄像机不是传统的摄像机。它的代码没搞明白,移动达不到预期。
希望有人能够给我讲解一下,这段代码的摄像机是怎么一个形式的。最终呈现出来的摄像机效果是怎样的。如果,能提供保持视线不变移动摄像机的方案的话,自然是极好的。非常感谢。Pos和Target是外部传进来的。
				DXDXVECTOR3 Pos, Target;
float dx = (Pos.x-Target.x);
float dy = (Pos.y-Target.y);
float dz = (Pos.z-Target.z);
float lXZ = fsqr(dx*dx + dz*dz);
float lYZ = fsqr(dy*dy + dz*dz);
float lXY = fsqr(dy*dy + dx*dx);
float XYZ = fsqr(dy*dy + dx*dx + dz*dz);
float sinY = (dx / lXZ);
float cosY = -(dz / lXZ);
float sinX = (dy / XYZ);
float cosX = (lXZ / XYZ);
float sinZ = 0.0f;
float cosZ = 1.0f;
DXDXMATRIX dmRot, dmRotX, dmRotY, dmRotZ,
   dmMov, dmView;
dmRotZ._11= cosZ ,dmRotZ._12= -sinZ ,dmRotZ._13= 0.0f ,dmRotZ._14= 0.0f;
dmRotZ._21= sinZ ,dmRotZ._22= cosZ ,dmRotZ._23= 0.0f ,dmRotZ._24= 0.0f;
dmRotZ._31= 0.0f ,dmRotZ._32= 0.0f ,dmRotZ._33= 1.0f ,dmRotZ._34= 0.0f;
dmRotZ._41= 0.0f ,dmRotZ._42= 0.0f ,dmRotZ._43= 0.0f ,dmRotZ._44= 1.0f;
dmRotY._11= cosY ,dmRotY._12= 0.0f ,dmRotY._13= -sinY ,dmRotY._14= 0.0f;
dmRotY._21= 0.0f ,dmRotY._22= 1.0f ,dmRotY._23= 0.0f ,dmRotY._24= 0.0f;
dmRotY._31= sinY ,dmRotY._32= 0.0f ,dmRotY._33= cosY ,dmRotY._34= 0.0f;
dmRotY._41= 0.0f ,dmRotY._42= 0.0f ,dmRotY._43= 0.0f ,dmRotY._44= 1.0f;
dmRotX._11= 1.0f ,dmRotX._12= 0.0f ,dmRotX._13= 0.0f ,dmRotX._14= 0.0f;
dmRotX._21= 0.0f ,dmRotX._22= cosX ,dmRotX._23= -sinX ,dmRotX._24= 0.0f;
dmRotX._31= 0.0f ,dmRotX._32= sinX ,dmRotX._33= cosX ,dmRotX._34= 0.0f;
dmRotX._41= 0.0f ,dmRotX._42= 0.0f ,dmRotX._43= 0.0f ,dmRotX._44= 1.0f;
dmMov._11= 1.0f ,dmMov._12= 0.0f ,dmMov._13= 0.0f ,dmMov._14= 0.0f;
dmMov._21= 0.0f ,dmMov._22= 1.0f ,dmMov._23= 0.0f ,dmMov._24= 0.0f;
dmMov._31= 0.0f ,dmMov._32= 0.0f ,dmMov._33= 1.0f ,dmMov._34= 0.0f;
dmMov._41= -X   ,dmMov._42= -Y ,dmMov._43= -Z ,dmMov._44= 1.0f;
dmRotX = dmRotZ * dmRotX;
dmRot = dmRotY * dmRotX;
dmView = dmMov * dmRot;


解决方案1:

补充一下,上面第一步计算出来的look,然后在世界空间计算它的旋转

解决方案2:

        DXDXVECTOR3 Pos, Target;  // Pos为摄像机位置,Target为摄像机看的位置
float dx    = (Pos.x-Target.x);  // dx dy dz 组成了Target到Pos的向量,即非Normalize的Look向量的反方向
float dy    = (Pos.y-Target.y);
float dz    = (Pos.z-Target.z);
 
float lXZ = fsqr(dx*dx + dz*dz);  // 从这儿开始计算上面那个类Look向量分别绕X/Y/Z轴旋转的角度
float lYZ = fsqr(dy*dy + dz*dz);
float lXY = fsqr(dy*dy + dx*dx);
float XYZ = fsqr(dy*dy + dx*dx + dz*dz);
 
float sinY = (dx / lXZ);
float cosY = -(dz / lXZ);
float sinX = (dy / XYZ);
float cosX = (lXZ / XYZ);
float sinZ = 0.0f;   // 设定摄像机没有翻滚,即不绕Z轴旋转
float cosZ = 1.0f;
 
// 这下面开始填充旋转矩阵
DXDXMATRIX dmRot, dmRotX, dmRotY, dmRotZ,
           dmMov, dmView;
dmRotZ._11= cosZ    ,dmRotZ._12= -sinZ    ,dmRotZ._13= 0.0f    ,dmRotZ._14= 0.0f;
dmRotZ._21= sinZ    ,dmRotZ._22= cosZ    ,dmRotZ._23= 0.0f    ,dmRotZ._24= 0.0f;
dmRotZ._31= 0.0f    ,dmRotZ._32= 0.0f    ,dmRotZ._33= 1.0f    ,dmRotZ._34= 0.0f;
dmRotZ._41= 0.0f    ,dmRotZ._42= 0.0f    ,dmRotZ._43= 0.0f    ,dmRotZ._44= 1.0f;
 
dmRotY._11= cosY    ,dmRotY._12= 0.0f    ,dmRotY._13= -sinY    ,dmRotY._14= 0.0f;
dmRotY._21= 0.0f    ,dmRotY._22= 1.0f    ,dmRotY._23= 0.0f    ,dmRotY._24= 0.0f;
dmRotY._31= sinY    ,dmRotY._32= 0.0f    ,dmRotY._33= cosY    ,dmRotY._34= 0.0f;
dmRotY._41= 0.0f    ,dmRotY._42= 0.0f    ,dmRotY._43= 0.0f    ,dmRotY._44= 1.0f;
 
dmRotX._11= 1.0f    ,dmRotX._12= 0.0f    ,dmRotX._13= 0.0f    ,dmRotX._14= 0.0f;
dmRotX._21= 0.0f    ,dmRotX._22= cosX    ,dmRotX._23= -sinX    ,dmRotX._24= 0.0f;
dmRotX._31= 0.0f    ,dmRotX._32= sinX    ,dmRotX._33= cosX    ,dmRotX._34= 0.0f;
dmRotX._41= 0.0f    ,dmRotX._42= 0.0f    ,dmRotX._43= 0.0f    ,dmRotX._44= 1.0f;
 
// 这里填充平移矩阵
dmMov._11= 1.0f    ,dmMov._12= 0.0f    ,dmMov._13= 0.0f    ,dmMov._14= 0.0f;
dmMov._21= 0.0f    ,dmMov._22= 1.0f    ,dmMov._23= 0.0f    ,dmMov._24= 0.0f;
dmMov._31= 0.0f    ,dmMov._32= 0.0f    ,dmMov._33= 1.0f    ,dmMov._34= 0.0f;
dmMov._41= -X   ,dmMov._42= -Y        ,dmMov._43= -Z        ,dmMov._44= 1.0f;
// 推测上面的X/Y/Z应该等于Pos的xyz 
dmRotX    = dmRotZ * dmRotX; // 将分别绕XYZ轴旋转的矩阵合成一个矩阵
dmRot    = dmRotY * dmRotX;
dmView    =&

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 项目代码中,诡异的摄像机,希望能够将摄像机按照现在的视线水平移动,求解

相关文章

  • 2017-06-05 给cocos2dx引擎做个界面工具,有人需要吗?
  • 2017-06-05 unity不同场景间怎么传值
  • 2017-06-05 刚入行cocos2d-x手游开发,怎么才能快速提高自己,提高工资
  • 2017-09-06canvas3d学习一 应用结构
  • 2017-06-05 求物体相对另一个物体的方向
  • 2017-06-05 cocos2d-xC++有什么好的教程吗?
  • 2017-06-05 请问游戏人物的影子是怎么实现的?
  • 2017-06-05 趋势:手游app压缩用户转化率越高
  • 2017-06-05 关于shader贴图叠加的一个疑问~~大神~救我~
  • 2017-06-05 iosUIkit中怎么添加cocos2dx的场景实现功能

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • cocos2dx-32的windows移植安卓的xml中文不显示问题
    • 怎样用脚本将角色姿态摆成标准的T-POS姿态,谢谢
    • cocos30版本使用vec2的问题
    • cocos2d-x的方向识别问题,只能左下,哪里错了吗?
    • 游戏各大引擎调研
    • Unity3D新版本的Animation系统怎么修改Material的Offset属性?
    • Cocos2d-x建工程时避免copy文件夹和库
    • Unity 3D菜单栏及快捷键详解
    • coco2dx的问题。急解答。谢谢
    • 怎么获得一个当前向量朝向相反的向量值?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有