了解投影矩阵

2023-12-07

我试图了解投影向量的值范围是多少。看起来和MSDN说的不符。

下面的代码输出一个彩色三角形。三角形完全可见。我期望在投影顶点之后,以下内容将成立:

X和Y的范围是-1到1。 Z的范围是0到1。

我从这里得到这个信息:http://msdn.microsoft.com/en-us/library/bb195665.aspx

但是,当我使用视图和投影矩阵的乘积手动变换三角形的顶点时,它们具有以下值:

{X:1,8 Y:0 Z:3,991996} {X:0 Y:3 Z:3,991996} {X:-1,8 Y:0 Z:3,991996}

为什么这些值超出了可见范围,而三角形却完全可见?

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System;
using Microsoft.Xna.Framework.Input;

namespace WasMachtDieProjektion
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;

        Matrix _view;
        Matrix _projection;
        VertexPositionColor[] _verticies;
        Vector3[] _vectors;
        BasicEffect _effect;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        protected override void LoadContent()
        {
            _vectors = new Vector3[] {
                new Vector3(-3,0,0),
                new Vector3(0,3,0),
                new Vector3(3,0,0)
            };

            _verticies = new VertexPositionColor[] {
                new VertexPositionColor(_vectors[0], Color.AliceBlue),
                new VertexPositionColor(_vectors[1], Color.Yellow),
                new VertexPositionColor(_vectors[2], Color.Red)
            };

            _effect = new BasicEffect(graphics.GraphicsDevice);
            _effect.VertexColorEnabled = true;

            GraphicsDevice.RasterizerState = new RasterizerState() { CullMode = CullMode.None };
        }

        protected override void Update(GameTime gameTime)
        {
            _view = Matrix.CreateLookAt(new Vector3(0, 0, -4f), new Vector3(0, 0, 0), Vector3.Up);
            _projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver2, GraphicsDevice.Viewport.AspectRatio, 0.01f, 20f);

            Vector3[] transformed = new Vector3[3];
            Matrix trans = _view * _projection;
            Vector3.Transform(_vectors, ref trans, transformed);

            foreach (var v in transformed)
            {
                Console.WriteLine(v);
            }
            Console.WriteLine("---");

            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            _effect.View = _view;
            _effect.Projection = _projection;

            foreach (var pass in _effect.CurrentTechnique.Passes)
            {
                pass.Apply();
                GraphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleList, _verticies, 0, 1);
            }

            base.Draw(gameTime);
        }
    }
}

不要忘记投影后的透视划分。这意味着乘以投影矩阵后,除以变换后的向量x, y and z由于他们w价值观。因此,您必须处理 4D 同质向量而不是 3D 向量。你的初始向量只是(x,y,z,1)但在应用投影矩阵(不是仿射变换)之后,它们的w可以(并且应该)!= 1,所以你必须除以它,这会实现实际的透视变形:

(x', y', z', w') = trans * (x, y, z, 1);
(x'', y'', z'') = (x'/w', y'/w', z'/w');

请查阅一些有关 3D 变换、投影和齐次坐标的介绍性材料,以获得更多见解。

EDIT:我刚刚在您的代码中看到了另一个错误。trans必须_projection * _view, 以便_view当将向量乘以trans。除非 XNA 使用数学上不正确的约定row_vector * matrix。如果是这种情况,您的订单应该可以完成。

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

了解投影矩阵 的相关文章

  • 从绘图 3d 图中抓取相机位置

    我正在绘制 3D 图形并想要调整相机位置 对我来说最好的方法是使用查看器 根据需要缩放和旋转场景 然后以 JSON 形式获取相机位置并将其放入我的脚本中 该脚本生成图片以默认实现相同的位置 根据这条推文 https twitter com
  • 无法访问生成配置管理器或 Visual C# 2010 Express 中的生成配置

    完整故事 通常 当我安装 Visual C 2010 Express 时 我做的第一件事就是切换到专家设置 这使我可以访问构建配置以及相应的管理器 最近的安装似乎行为不当 我创建的第一个项目是 XNA 4 0 刷新 项目 我导入了一些旧代码
  • WP7 XNA 显示 3D FBX 模型

    我只是初学者 很抱歉我的愚蠢问题 我的模型看起来像这样 http img265 imageshack us img265 8291 clipboard01ap jpg http img265 imageshack us img265 829
  • 在 Xna/MonoGame 中按程序生成 Texture2D

    如何使用代码按程序生成Texture2D 例如 我希望在 32x32 图像上交替出现黑白像素 您可以使用 GraphicsDevice 创建一个新的纹理 public static Texture2D CreateTexture Graph
  • CSS3“曲面”3D 变换/透视帮助

    我正在尝试为我的网站创建一种有观点的人群 它实际上是一个充满平面图像的 ul 我想创建一种 弯曲 的感觉 就像圆形的人群一样 它向内并且向内明显变小 并向末端弯曲 海报圈的例子是我能找到的最接近的http www webkit org bl
  • 3d 表面的凸包算法 z = f(x, y)

    我有一个以一组三元组 x i y i z i 形式给出的 3D 表面 其中 x i 和 y i 大致位于网格上 并且每个 x i y i 都有一个关联的 z i 值 典型的网格是20x20 我需要在给定的公差范围内找到哪些点属于曲面的凸包
  • 将球体上的 3d 点转换为 UV 坐标

    我在球体上有一个 3d 点 想要将其转换为球体纹理上的 UV 点 有人可以指出正确的方向吗 我可以采用纯数学解决方案 Edit 我目前有这个 它不会返回正确的 UV 坐标 p 是球体上的 3d 点 mesh position 是球体的位置
  • 给定 3D 空间中的一条线,如何找到从它到一点的角度?

    我在 3D 空间中有两组点 我想画一条穿过两组点的中心的线 然后找到从该线到每个点的角度 从那里开始 我将根据两个角度的接近程度来确定两组中的匹配点 我知道如何找到每组点的中心 只需将它们平均在一起 并且我知道如何将它们匹配 甚至考虑到它们
  • 提取给定 2D 图像点、深度图和相机校准矩阵的 3D 坐标

    我有一套2D image输出的关键点OpenCV FAST角点检测功能 使用Asus Xtion I还有一个时间同步的深度图 其中所有相机校准参数都是已知的 使用这些信息我想提取一组3D坐标 点云 在OpenCV 任何人都可以给我任何有关如
  • 3D 游戏的 Libgdx 渲染层

    在我的第一个 3D 游戏中 我现在想要渲染地板 它实际上是一个平面 不是 libgdxPlane on y 0 我想添加一个Texture到它 这样我就可以在每个级别有不同的楼层 现在我的问题是 创建和渲染这种纹理地板的最佳方法是什么 我考
  • 如何在 OpenCV 中绘制图像的 3D 直方图

    更新 我找到更多例子 我现在可以做到 我可以在 3d 中绘制多个直方图吗 https stackoverflow com questions 35210337 can i plot several histograms in 3d 我知道这
  • 点列表的 3D 轮廓(凹壳)

    我有一个 C 中的 Vector3 点列表 我需要计算这些点的凹轮廓 确实有很多参考资料 特别是对于 凸 分辨率 由于格雷厄姆算法 我已经成功实现了 然而 由于我现在需要有效地计算凹轮廓 所以我迷失了 维基百科确实列出了很多用于凸计算的资源
  • 从 NumPy 数组中的数据绘制 3D 图像

    我有一个 NumPy 数组中的数据文件 我想查看 3D 图像 我正在分享一个示例 我可以在其中查看大小为 100 100 的 2D 图像 这是 xy 平面上 z 0 处的切片 import numpy as np from matplotl
  • 在 Three.js 中将贝塞尔曲线转换为平面道路

    我试图根据之前计算得到的一些贝塞尔曲线在 Three js 中绘制一条弯曲的道路 问题是我找不到转换曲线序列的方法 一条从上一条曲线的末尾开始 到一个曲面 我有一个 3D 场景 其中有一些汽车 一条用飞机创建的道路 并且绘制了即将到来的道路
  • 编译 XNA 项目时,无法执行请求的操作错误

    第二次编译项目时 出现以下错误消息 我必须关闭 VS 2010 重新加载时它会编译 如果我做出改变 那么问题又回来了 无法复制文件 obj x86 Debug MyFile dll 无法对打开的用户映射部分的文件执行请求的操作 我因为另一个
  • 使用接口将泛型委托转换为另一种类型

    使用 NET 4 0 好的 所以我有 private Dictionary
  • OpenGL z轴指向哪里?

    我正在尝试了解 OpenGL 坐标系 我到处都看到它被描述为右撇子 但这与我的经验不符 我尝试绘制一些形状和 3 d 对象 我发现 z 轴显然指向 屏幕 而 x 指向右侧 y 指向上方 这是左手坐标系的描述 我缺少什么 编辑 例如 http
  • 3D 数学:根据“向上”和“向上”正交向量计算倾斜(滚动)角度

    我希望这是提出这个问题的正确位置和这个一样 https stackoverflow com questions 3035590 bank angle from up vector and look at vector 但表示为纯数学而不是图
  • MonoGame真的跨平台吗?

    当我下载 MonoGame 我将使用它来代替 XNA 因为我使用的是 Mac 并解压它时 所有 MonoDevelop 解决方案文件都被命名为MonoGame Framework PLATFORM NAME sln with PLATFOR
  • 在球体边缘绘制点

    因此 来自 Flash 背景的我对一些简单的 2D 三角函数有很好的理解 在带有 I 圆的二维中 我知道使用给定角度和半径将项目放置在边缘上的数学 x cos a r y sin a r 现在 如果我在 3d 空间中有一个点 我知道球体的半

随机推荐

  • Mac 上 fopen 函数的问题

    我正在 Mac 上制作一个简单的应用程序 OSX Mavericks 用 clang 编译 问题是 当我尝试使用相对路径打开文件时 它不起作用 如果我使用绝对路径它就有效 例如 如果我尝试 fp fopen file txt r 它返回NU
  • 如何跨多个组件重用 Angular Observable? (为了避免重复请求两次?)

    我有一个服务 MyHttpService 其中包含如下可观察值 grabData return this http get myaddress map res Response gt return res json catch error
  • vba:将变量传递到错误句柄中

    我有一个声明 on error go to label 但是我想将导致错误的变量传递到标签中 这可能吗 您可以使用 Err 来获取错误编号和描述 Sub Function SomeName On Error GoTo Err SomeNam
  • Mongodb 不同聚合

    我正在尝试使用聚合框架在 mongo 中执行组计数 但结果并不完全符合预期 考虑下面的集合 people gt insert array user id gt 1 day gt Monday age gt 18 people gt inse
  • puppet 如何向操作系统发送命令?

    我是 Puppet 的新手 但很了解这些概念 Puppet 清单调用 Puppet 模块 模块执行实际任务 我试图了解 Puppet 模块层发生的情况 该命令实际上是如何执行的 以下面的例子为例 实际向操作系统传递了哪些命令 另外 它是在哪
  • 如何使用 LESS 将参数传递给 CSS 类?

    不确定使用 LESS 是否可以 但我看到 rotate degrees 这仅适用于 LESS 我希望能够编写一个 CSS 类并将数字作为 HTML 中的参数传递 例如 div class 这只是我使用的重复 CSS 类的一个示例 但即使传递
  • 如何从网页/网络表单发送电子邮件?

    有哪些技术可用于通过网页或网页上的表单发送电子邮件 我有一些背景想法 您可以将表单数据发布到脚本 但我真的不知道 cgi 脚本是什么 我很想知道这是否是建议的方法 或当前的做法是什么是 这只是为了给用户提供一些联系运营商的方式 页内表单似乎
  • 如何使用 nuget 分发特定于处理器的 WindowsStore 程序集

    我有一个程序集 它链接到 Windows 应用商店应用程序的本机 Sqlite 由于 Sqlite 是本机的 因此该程序集无法使用 AnyCPU 配置文件 相反 它必须提供单独的 AnyCPU x86 x64 程序集 我想通过 nuget
  • 按输出的特定顺序对属性进行排序

    如何在不显式编写的情况下按特定顺序编写元素属性 考虑
  • 使用 Java 转换为 FLV

    有谁知道如何使用java将任何类型的视频格式转换为flv 我一直在寻找用于转换视频的java api 但似乎没有这样的东西 但可能有办法做到这一点 我的意思是像youtube服务这样的东西确实可以转换视频 但是使用java 我需要一个网络应
  • 智能 Gwt 组件未在 html div 标签中呈现

    我正在使用智能 GWT 来开发我的应用程序 以创建我正在使用 GWT 组件的应用程序的结构 HTML代码片段如下 div class container div div div In my pagePaneldiv 所有组件均已添加 当我在
  • Java中“IS -A”关系和“HAS-A”关系有什么区别? [复制]

    这个问题在这里已经有答案了 我是JAVA新手 刚刚开始学习 IS A 和 HAS A 关系 但我并没有真正理解它 IS A 和 HAS A 有什么区别 什么时候应该使用 IS A 什么时候应该使用 HAS A IS A 关系是继承 继承的类
  • 如何在 Lucene 中仅标记某些单词

    我在我的项目中使用 Lucene 并且需要一个自定义分析器 Code is public class MyCommentAnalyzer extends Analyzer Override protected TokenStreamComp
  • 需要正则表达式模式来将日期与可选时间相匹配

    我需要一个将日期与可选时间相匹配的正则表达式模式 该日期应该是有效的美国日期m d yyyy格式 时间应该是h mm ss am pm或24小时时间hh mm ss 比赛 2011 年 9 月 1 日 2011 年 9 月 1 日上午 10
  • 使用 Laravel 5.8 身份验证和外部 JSON API(创建自己的 ServiceProvider)

    我正在构建一个 Laravel 5 8 应用程序 作为用 Go 编写的外部 API 的前端 我将用户 通行证发布到 API 然后 API 使用 HTTP 200 和 JSON 令牌 JWT 或 HTTP 401 进行响应 以表明凭据无效 我
  • Angular 2 客户端错误

    我刚刚接触 Typescript 和 Angular 2 我想知道哪种方法最适合记录客户端错误 这样如果生产中发生问题 我就能够找出失败的方法以及引发的错误 该应用程序的后端是用 C 编写的 并连接到 SQL Server 数据库 数据通过
  • jQuery 不关闭窗口

    我正在为电子商务网站制作一个表单 供用户请求有关某个项目的 PDF 该表单工作正常并将用户发送到 感谢 页面 在感谢页面上 我让 jQuery 设置了 5 秒后关闭窗口的时间间隔 但它不起作用 在链接中嵌入关闭命令也不起作用 但是 如果 感
  • 将整数列表分配给 @var

    I can declare idOrder int set idOrder 21319 I want declare idOrder int set idOrder 21319 21320 用于 WHERE 子句使用 IN 运算符的一系列语
  • JPackage 只能用于一个应用程序?

    我有一个 java 应用程序 在运行时将生成另一个 JVM 但我想使用 jpackage 打包我的应用程序 它运行得很好 但在运行时 当我的应用程序尝试使用以下命令调用下一个 JVM 时 File javaHome new File Sys
  • 了解投影矩阵

    我试图了解投影向量的值范围是多少 看起来和MSDN说的不符 下面的代码输出一个彩色三角形 三角形完全可见 我期望在投影顶点之后 以下内容将成立 X和Y的范围是 1到1 Z的范围是0到1 我从这里得到这个信息 http msdn micros