XNA 查看矩阵 - 寻求解释

2024-01-23

我在理解 XNA 中的视图矩阵时遇到了一些严重的问题。我已经在所有其他部分方面取得了很大的进展,并且由于我刚刚学会了所需的数学知识,因此我不想在不首先了解内置矩阵函数的作用的情况下使用它们。

现在我了解了旋转、投影和平移的基础知识,但我一生都无法理解视图矩阵在 XNA 中的工作原理。

根据我收集的信息,视图矩阵应该将“世界”转换为它自己的空间。看似合理,但库中的 Matrix.CreateLookAt 方法却相当令人费解。

我已经确定(通过检查库函数的输出)这两段代码产生相同的结果:

Matrix view = Matrix.CreateReflection(new Plane(Vector3.UnitX, 0)) * Matrix.CreateReflection(new Plane(Vector3.UnitZ, 0)) * Matrix.CreateTranslation(Position);
// ..equals this if (Position = (0 0 -5), since LookAt "looks at" but the above just looks straight down Z)..
Matrix blah = Matrix.CreateLookAt(Position, Vector3.Zero, Vector3.UnitY);

为什么要翻转 X 轴和 Z 轴?我认为你应该根据相机的旋转来旋转世界,但方向相反,然后将世界沿相反方向平移相同的量。

或者视图矩阵根本不用作变换而只是编码相机在世界中的位置和旋转?


您需要了解三种类型的变换:世界变换、视图变换和投影变换。

世界变换将模型坐标从模型空间更改为世界空间。当您定义模型的顶点时,您是相对于该模型的原点来定义它们的。世界变换对这些顶点进行变换,使它们相对于场景中所有对象共享的原点(即世界空间)。

然后视图变换将这些顶点变换到视图空间。观察者/相机在视图空间中具有位置和方向,这用于创建应用于场景中所有对象的视图矩阵。在视图空间中,观察者/相机位于原点,因此视图矩阵会平移并旋转所有对象以将它们放置在视图空间中。

最后,投影变换决定相机使用什么类型的“镜头”。到目前为止,我们只平移和旋转了对象,没有比例感或透视感。投影变换创建一个视锥体并将顶点变换到该视口中。

现在回答你的问题。您先绕 x 轴反映坐标系,然后再反映 z 轴,最后进行平移。这恰好会产生与观察矩阵相同的结果,因为位置位于 xz 和 yz 平面上,但请注意如果将位置沿 y 轴向上移动一个单位会发生什么。那么两个矩阵将不相等

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XNA 查看矩阵 - 寻求解释 的相关文章

  • 使用来自本地对象的消息的 std::Exception

    以下代码是否可以安全地抛出带有自定义消息的异常 include
  • HttpResponseMessage 的内容为 JSON

    我有一个 ASP NET MVC WEB API 由于多种原因 由于没有授权而重定向 我不能只使用一个简单的对象并在我的控制器方法中返回它 因此我需要 HttpResponseMessage 类来允许我重定向 目前我正在这样做 var re
  • 如何在C编程中获取当前时间(以毫秒为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 如何使用 ANSI C 测量以毫秒为单位的时间 https stackoverflow com questions 361363 how to measure time in milliseconds
  • 使用 gcc 编译 C 时,预处理的 .i 文件中的数字意味着什么?

    我想了解编译过程 我们可以使用以下命令查看预处理器中间文件 gcc E hello c o hello i or cpp hello c gt hello i 我大致知道预处理器的作用 但我很难理解某些行中的数字 例如 1 usr incl
  • C++17 中带有 noexcept 的 std::function

    在 C 17 中noexcept 已添加到类型系统中 http www open std org jtc1 sc22 wg21 docs papers 2015 p0012r1 html void r1 void f noexcept f
  • 在 C 中声明和初始化数组

    C 有没有办法先声明然后初始化数组 到目前为止 我一直在初始化一个这样的数组 int myArray SIZE 1 2 3 4 但我需要做这样的事情 int myArray SIZE myArray 1 2 3 4 在 C99 中 您可以使
  • 有哪些 API 可在 Windows 中使用 C# 配置扬声器设置?

    我环顾了很多不同的地方 但似乎找不到一个简单的方法来做到这一点 我在 Windows 7 中有多个声卡 并使用 HDMI 将声音输出到我的 AVR 放大器 我遇到的问题是 当放大器关闭时 它会导致窗口丢失扬声器配置 所以我想做的是编写一个小
  • 没有真正理解 std::atomic::compare_exchange_weak 和compare_exchange_strong 的逻辑

    我读了https en cppreference com w cpp atomic atomic compare exchange https en cppreference com w cpp atomic atomic compare
  • 使用 MapViewOfFile 有什么限制吗?

    我正在尝试将内存映射文件用作 hFile CreateFile State Path GENERIC READ FILE SHARE READ FILE SHARE WRITE 0 OPEN EXISTING FILE FLAG SEQUE
  • 黑莓 - 可以隐藏视频字段吗?

    我想编写一个像手电筒这样的应用程序 在相机 LED 的帮助下 Player player javax microedition media Manager createPlayer capture video encoding video
  • 如何忽略搜索条件中的空属性

    我有一个不好的要求要做 无论如何 我必须在我的应用程序中实现它 我有一个Track class public class Track public string Name get set public string City get set
  • 复杂的 C 声明

    我刚刚在互联网上浏览了一些代码 发现了这个 float foo SIZE SIZE 我如何阅读这份声明 是否有一套特定的规则来阅读如此复杂的声明 我有一段时间没做这个了 从 开始foo然后向右走 float foo SIZE SIZE fo
  • DLL 中的 XP 风格组合框

    我需要使用 C 和 WIN32 API 无 MFC 在 DLL 中创建 XP 风格的组合框 我设法在 DLL 中创建控件 不是以 XP 风格 我设法在带有清单的 exe 中创建 XP 样式组合框 但它在 DLL 中不起作用 为了让您的 DL
  • Windows Phone HttpClient PostAsync 挂起且无响应

    我在拨打电话时遇到问题HttpClientWP 应用程序的 post 方法 PostAsync总是挂起并且不给出任何响应 当我从 WPF 应用程序中尝试时 相同的代码可以工作 这是我正在做的事情 服务器Web API代码 public cl
  • 如何从句柄确定进程是 32 位还是 64 位?

    如何从使用 OpenProcess 获取的进程句柄中获取信息 无论进程是 32 位还是 64 位 是的 IsWow64Process 毫无用处 令人烦恼 它的真正意思是 启用了 32 位模拟 如果您在 32 位操作系统上运行 则返回 fal
  • 派生类的聚合初始化

    以下代码无法使用 Visual Studio2017 或在线 GDB 进行编译 我期望它能够编译 因为迭代器只是一个具有类型的类 并且它是从公共继承的 这是不允许的还是在 VS2017 中不起作用 template
  • 检测用户是否正在滚动 dataGridView 滚动条

    我正在更新一个dataGridView与一个新的数据表使用 dataGridView1 DataSource table 但是 我不想在用户滚动 dataGridView 时执行此操作 如何检查滚动条是否正在滚动或已完成滚动 即拖动而不是单
  • 即使对于新上下文,OnModelCreating 也仅调用一次

    我有多个相同但内容不同的 SQL Server 表 在编写代码优先 EF6 程序时 我尝试为每个程序重用相同的数据库上下文 并将表名称传递给上下文构造函数 然而 虽然每次都会调用构造函数 但尽管每次都是从 new 创建数据库上下文 但 On
  • 没有运算符“<<”与这些操作数匹配[重复]

    这个问题在这里已经有答案了 不知道发生了什么事 我查看了与此问题类似的其他帖子 但到目前为止没有解决方案有帮助 这是带有错误部分注释的代码 在某一时刻 它说 不起作用 而在代码的其余部分中 它说 include
  • 如何通过Task.ContinueWith创建传递?

    我想在原始任务结束时添加一个任务 但想保留原始结果和类型 附加任务仅用于记录目的 例如写入控制台等 例如 Task Run gt DateTime Now Hour gt 12 Hey throw new Exception Continu

随机推荐

  • 根据另一个依赖项的版本使用不同的代码

    以下情况 库 X 由我维护 依赖于库 Y 版本 2 0 对于库 Y 存在较新的主要版本 3 该版本通常更好 将基于 Y 2 构建的代码升级到 Y 3 非常简单 但仍然需要对现有代码进行一些调整 Y 是 X 的依赖项 因此升级它会迫使 X 的
  • 还有人知道这是什么意思吗?

    static final boolean assertionsDisabled java util TaskQueue desiredAssertionStatus 在源文件中看到的java util TaskQueue java Quot
  • Kotlin:公共获取私有设置变量

    在 kotlin 中定义具有公共 getter 和私有 仅内部可修改 setter 的 var 的正确方法是什么 var setterVisibility String abc Initializer required not a null
  • 该证书的颁发者无效:钥匙串将所有证书标记为“无效颁发者”[重复]

    这个问题在这里已经有答案了 钥匙串突然将我的钥匙串中的所有证书显示为无效 因为它在 2 天前工作 我还检查了开发人员门户 它在那里显示有效 它将钥匙串中的每个证书标记为 该证书的颁发者无效 正如消息表明 这一定是发行人方面的问题 而我们的发
  • InternalResourceViewResolver 与 UrlBasedViewResolver 有何不同

    我刚刚开始使用Spring 我遇到了很多教程 我看到了更多使用的例子InternalResourceViewResolver than UrlBasedViewResolver 我查看了 Spring 文档 但我无法弄清楚使用其中之一的好处
  • 尝试使用 FragmentActivity 时无法访问 ActivityCompat Api 23

    我尝试在我的智能手表上使用 ViewPager 但在尝试重建 运行 调试我的应用程序时不断收到错误 我正在使用 FragmentActivity 这就是发生错误的地方 我搜索了 stackoverflow 和教程网站来看看可能是什么问题 很
  • 为什么没有“国外进口原药不安全”?

    这是我之前问题的后续here https stackoverflow com questions 41213378 using foreign import prim with a c function using stg calling
  • 在现有的 Ruby on Rails 应用程序中创建博客

    我有兴趣向我的 Ruby on Rails 应用程序添加博客 我不想浪费时间在 Rails 中编写 bloggin 应用程序 我可以做到 但我只是更喜欢更强大的东西 我研究过 Wordpress 它似乎是最好的博客平台之一 我的问题是如何将
  • 实体框架返回旧数据

    我遇到了 EF 无法在 3 层 WPF 应用程序中返回最新数据的问题 我怀疑这与我处理上下文生命周期的方式有关 这是场景 UnitOfWork 内包含多个存储库 还有一项服务 MyService 它使用 UnitOfWork 此 UnitO
  • 使用朴素贝叶斯分类器对推文进行分类:一些问题

    除了其他来源之外 我还使用 Stackoverflow 上的各种帖子 尝试实现自己的 PHP 分类器 将推文分为正面 中性和负面类别 在编码之前 我需要理清流程 我的思路和例子如下 p class p words class Bayes t
  • Nemerle 和 F# 在 .Net 上的功能比较

    社区维基问题 根据这个问题 在 Net 中使用 Scala 有什么好处 https stackoverflow com questions 3587499 what are the benefits of using scala in ne
  • ios7中光标可见性问题

    只需创建一个UITextField in ios7 SDK但是当我输入一些内容时 会显示文本UItextField但光标不是 关于可能出现什么问题的任何线索吗 使用光标更改 UITextField 的tintColor mobileText
  • Java 中的重定向 stdin 和 stdout

    我正在尝试重定向 java 中子进程的标准输入和标准输出 最终我会将输出转到 JTextArea 或其他东西 这是我当前的代码 Process cmd Runtime getRuntime exec cmd exe cmd getOutpu
  • C# 映射两个复杂对象

    我有四门课 public class Customer public string FirstName get set public string LastName get set public List
  • 获取从 firebase firestore 返回的文档中的特定字段

    所以 我有一个可能非常容易解决的问题 我只是不太明白 本质上 此时我正在尝试将特定文档的字段存储到 2 个变量中 以便我可以在其他地方使用它们 这是我的 firestore 层次结构 这是我到目前为止的代码 我认为我走在正确的轨道上 但我不
  • 如果类“包含”或正则表达式,美丽的汤?

    如果我的班级名称不断不同 例如 listing col line 3 11 dpt 41 listing col block 1 22 dpt 41 listing col line 4 13 CWK 12 通常我可以这样做 for Eac
  • Mercurial:获取有关存储库的信息而不克隆它们

    几天前 我开始尝试 Mercurial 一切都很顺利 直到我决定尝试编写一个小程序 该程序从远程服务器获取存储库列表和每个存储库的变更集 ID 列表 允许用户选择存储库并变更集 克隆它并更新到所选的修订版 这引发了两个问题 有没有办法从服务
  • 尝试将字符串文字作为模板参数传递[重复]

    这个问题在这里已经有答案了 我正在尝试找到一种舒适的方法来将字符串文字作为模板参数传递 我不关心支持尽可能多的编译器 我正在使用最新版本的 g std c 0x 我尝试了很多可能的解决方案 但都令我失望 我有点放弃了 但首先我想知道why其
  • 在Python中评估布尔环境变量

    在Python中如何评估环境变量是否为布尔值True 使用是否正确 if os environ ENV VAR is True Option 1 我认为这很有效 my env os getenv ENV VAR False lower in
  • XNA 查看矩阵 - 寻求解释

    我在理解 XNA 中的视图矩阵时遇到了一些严重的问题 我已经在所有其他部分方面取得了很大的进展 并且由于我刚刚学会了所需的数学知识 因此我不想在不首先了解内置矩阵函数的作用的情况下使用它们 现在我了解了旋转 投影和平移的基础知识 但我一生都