Direct3D顶点坐标变换

浅谈D3D透视-一 目前大部分游戏通过Direct3D实现3D效果,通过挂钩相应函数,可以实现3D透视,屏幕挂字效果。而透视,屏蔽特定效果,设置透明在很多游戏(特别是FPS)中发挥着巨大的作用!D3DDirectX的功能都是以COM组件的形式提供的。在Direct3D中,主要通过采取以下操作来实现编程: 调用适当的函数获取接口指针; 调用接口的方法(成员函数)来完成所需功能; 用完接口后,调用Release方 阅读详情

开始的话:顶点坐标变换时Direct3D学习中的入门基础,在这里将详述其原理:

Direct3D中渲染三维对象的过程分为两个阶段:《1》T&L(Transforming and Lighting),即坐标变换和光照;

                                                                《2》光栅化处理阶段。

 

一,T&L流水线:

      如下图:

                    

 

1,世界变换和世界坐标系(局部坐标变为世界坐标):

      物体在三维空间中的变形和运动的过程称为世界变换(平移,旋转,缩放),这个三维空间就是世界空间,其坐标系就是三维坐标系

      世界变换事实上就是将物体顶点从模型空间转换到世界空间中,模型空间其实就是在三维设计软件(如3DSMAX)中为物体设定的坐标系,也称局部坐标系。而世界坐标则是所有物体都是用同一个世界坐标原点的坐标系,变换就是指对模型进行平移,旋转,缩放及它们的任意组合变换。

      使用以下公式对点P1进行世界变换。

           P2(X,Y,Z,1)=dot(P1(X,Y,Z,1),M)

      M为世界变幻矩阵,它实现物体的平移,旋转,缩放,dot为点乘,P2为变换后的坐标,p1为变换前的坐标。

            以下为实现世界坐标矩阵变换的DirectX代码(C++):

D3DXMATRIX matWorld; // 世界变换矩阵
D3DXMATRIX matTranlate,matRotation,matScale; // 变换矩阵,旋转矩阵,缩放矩阵
D3DX
MatrixScaling( & matScale,  1.0f , 1.0f , 5.0 ); // 在Z轴上放大5倍
FLOAT fAngle  =   60 * ( 2.0f * D3DX_PI) / 360.0f ; // 计算需要旋转的角度
D3DXMatrixRotationY( & matRotation,fAngle); // 绕Y轴旋转60度
D3DXMatrixMultiply( & matTranlate, & matScale, & matRotation); // 组合两个矩阵
D3DXMatrixTranslation( & matTranlate, 30.0f , 0.0f , 0.0f ); // 沿X平移30个单位
D3DXMatrixMultiply( & matWorld, & matWorld, & matTranlate); // 组合得到世界变幻矩阵
g_pd3dDevice -> SetTransform(D3DTS_WORLD, & matWorld); // 为Direct设备设置世界变换矩阵

      通过以上的代码,就可以使每个将要输出的物体通过相同的变换矩阵放到世界坐标系中(关于没种变换的详细计算方法以后有机会补上)

2,观察变换和观察坐标系(世界坐标变为以摄像机位置为原点的坐标):

      观察坐标系是以摄像机(屏幕中显示的图形就是虚拟摄像机拍摄在胶片上的景物)为摄像机位置为原点,摄像机观察的方向向着Z轴而建立的坐标系,他由世界坐标变为观察坐标就是观察变换。

原理如下图所示(从左到右三幅图)

 

      

观察变换使用世界坐标点乘观察变换矩阵,观察变换矩阵根据摄像机在世界坐标系的所在位置及其观察方向在世界坐标系中的方向,将世界坐标系下的所有对象重新定位。以下代码是设置观察变换矩阵的方法: 

D3DXVECTOR3 vEyePt( 0.0f , 3.0f , - 5.0f ); // 摄像机在世界坐标系中所在的位置
D3DXVECTOR3 vLookatPt( 0.0f , 0.0f , 0.0f ); // 摄像机观察点的位置
D3DXVECTOR3 vUpVec( 0.0f , 1.0f , 0.0f ); // 摄像机的向上量,通常为(0,1,0)指与Y轴
D3DXMATRIX matView;
D3DXMatrixLookAtLH(
& matView, & vEyePt, & vLookatPt, & vUpVec); // 生成观察变换矩阵,此为左手坐标系专用函数
g_od3dDevice -> SetTransfrom(D3DTS_VIEW, & matView); // 设置观察变换矩阵

 

3,光照:

      因不涉及到坐标变换(暂略)

4,投影变换和投影坐标系(将去景截头体的点变成身前矩形中的点):

      将观察坐标系上的三维物体投影到二维表面上,就是投影变换,其坐标系以胶片中心为参考原点(此坐标系的坐标为浮点坐标)。

      投影变换在DirectX中有两种基本的方法:正交投影和透视投影。

 (1) 正交投影(感觉这种比较少用到):

      物体坐标沿观察坐标系的z轴平行投影到观察平面上,观察点和观察平面间的距离不会影响物体的大小。其取景范围是一个矩形

代码:

D3DXMATRIX matProject;
D3DXMatrixOrthoLH(
& matProject,w,h,znear,zfar); // w,h为宽和高,znear和zfar为最近和最远距离,使用后得到变换矩阵
g_pd3dDevice -> SetTransform(D3DTS_PROJECTION, & matProject);

(2)透视投影:

      原理是将一个取景截头体转换成一个立方体,因为截头体的近端比远端小,所以变为立方体时,近端的物体就被放大。而对象的距离离摄像机越远则成像越小。

在这里提供一个函数:

D3DXMATRIX ProjectionMatrix( const   float  near_plane, // 到近裁面的距离
                             const   float  far_plane, // 到远裁面的距离
                             const   float  fov_horiz, // 视角的水平范围(弧度)
                             const   float  fov_vert) // 视角的垂直范围(弧度)
{
     
float  h,w,Q;
     w 
=  ( float ) 1 / tan(fov_horis * 0.5 ); // cot(fov_horis/2)
     h  =  ( float ) 1 / tan(fov_vert * 0.5 ); // cot(fov_horis/2)
     Q  =  far_plane / (far_plane - near_plane);
     D3DXMATRIX matProject;
     ZeroMemory(
& matProject, sizeof (matProject));
     matProject(
0 , 0 )  =  w;
     matProject(
1 , 1 )  =  h;
     matProject(
2 , 2 )  =  Q;
     matProject(
3 , 2 )  =   - Q * near_plane;
     matProject(
2 , 3 )  =   1 ;
     
return  matProject;
}

得到矩阵(这个矩阵的参数由上面函数得到,因为要画图才能说明白,所以就算了,有兴趣的可以自己去看看相关资料)

w   0     0     0

0    h    0     0

0    0    Q     1

0    0   -Qz    0

此矩阵即为投影变换矩阵。可以使用DirectXapi

D3DXMatrixPerspectiveFovLH()来构造一个投影矩阵。

 5,视区变换和屏幕坐标系(化为屏幕像素):

      将投影坐标变换为基于像素的屏幕坐标,需要定义视区的大小。

      关于这个先给出一个结构体:

 

typedef  struct  _ D3DVIEWPORT9
{
    DWORD x;
// 视区左上角的X坐标
    DWORD y; // 视区左上角的Y坐标
    DWORD Width; // 视区宽度
    DWORD Height; // 视区高度
     float  MinZ; // 视区内景物的最小深度,0.0f~1.0f
     float  MaxZ; // 视区内景物的最大深度,0.0f~1.0f
}

以下是一个设置视区的代码:

 

RECT rect;
GetClientRect(hWnd,
& rect); // hWnd为绘制窗口的句柄
D3DVIEWPORT9 pViewport  =  { 0 , 0 ,rect.right,rect.bottom, 0.0f , 1.0f };//定义D3DVIEWPORT
if (SUCCESSED(pd3dDevice -> SetViewport( & pViewport)))//设置视区
{
   .
// 处理代码
DirectX 3D空间坐标与灵活顶点格式 DirectX 3D空间坐标与灵活顶点格式 随博客工程实例文件,希望对大家有所帮助 立即下载

相关推荐

facebook协议

支持同时登录多个Facebook账号,按照关键词采集小组地址,群发小组,批量添加推荐人,群发推 荐人消息,采集个人Facebook用户,群发用户私信,群发主页评论。通过客服台管理功能,和粉丝互动聊天,通过话术快捷回复,自动翻译聊天记录。通过FaceBook小组采集小组成员id,或者通过FaceBook个人主页,采集主页上粉丝批量操作已FaceBook账号添加推荐热,可以指定添加某个国家的推荐人,可以设置每个账号添加推荐人个数去重模式:所有的FaceBook账号不添加重复的推荐人。

2503_90751938的博客 951

Direct3D基础(顶点坐标变换)

开始的话:顶点坐标变换时Direct3D学习中的入门基础,在这里将详述其原理: Direct3D中渲染三维对象的过程分为两个阶段:《1》T&L(Transforming and Lighting),即坐标变换和光照; 《2》光栅化处理阶段。 ...

dixuanzi9967的博客 490

VS2022下C# WPF项目一键打包成独立exe的完整指南

本文提供了一份在Visual Studio 2022中将C# WPF项目一键打包成独立可执行exe文件的完整指南。通过配置项目属性、启用单文件发布和自包含模式,开发者无需依赖第三方工具,即可生成可在未安装.NET运行时的电脑上直接运行的独立程序,极大简化了桌面应用的分发流程。

weixin_28831399的博客 670

第13章 迈向三维世界——Direct3D 的四大变换

本章我们将介绍使用Direct3D 创建三维游戏的基础,四大变换的概念和使用的方方面面。所谓四大变换,其实是作者结合自己的经验,总结出来的对世界变换、取景变换、投影变换和视口变换的总称而已。 13.1 四大变换的基本认知 首先,我们来讲讲周边的概念。 在Direct3D 中,如果我们未进行任何空间坐标变换而直接绘制图形的话,图形将始终处于应用程序窗口的中心位置,在默认情况下这个位置就会成

起个名字好难啊 1260

STM32实战篇:使用USART发送/接收数据

在发送字符时也可以直接使用其对应的ASCLL码,例如: USART_SendData(USART1, 0x61);

qq_74114817的博客 596

(三)从零开始学习模糊控制——模糊决策

模糊控制之基础——模糊数学 (一)模糊数学——基本概念 (二)模糊数学——模糊关系 (三)模糊数学——模糊决策 文章目录模糊控制之基础——模糊数学前言一、模糊决策法1.最大值原理2.模糊排序2.模糊寻优总结 前言   模糊决策是指在模糊环境下进行决策的数学理论和方法。这类问题─般具有大系统特征,系统之间的关系十分复杂,存在不能准确赋值的变量,这些变量属于模糊因素,涉及到一定的主观因素,使得子系统之间、变量之间的关系不清晰,从而必须借助排序、模糊评判等方法来进行处理。 一、模糊决策

qq_43667552的博客 4750

DirectX11 With Windows SDK--04 变换

前言 这一章涉及的是常用的矩阵变换,绝大部分内容节选自龙书,以帮助大家构建矩阵与2D/3D空间的数学联系。 学习目标: 了解Direct3D的一些内在规定 掌握矩阵变换与2D/3D空间的联系 熟悉3D变换与投影成像的过程 熟悉2D变换与投影成像的过程 DirectX11 With Windows SDK完整目录 Github项目源码 欢迎加入QQ群: 727623616 可以一起探讨DX11,...

X_Jun的博客 2335

ThinkPHP+Layui开发的ERP管理系统

ERP采购生产销售系统,一款基于ThinkPHP+Layui开发的ERP管理系统,帮助中小企业实现ERP管理规范化,此系统能为你解决五大方面的经营问题:1.采购管理 2.销售管理 3.仓库管理 4.资金管理 5.生产管理,适用于:服装鞋帽、化妆品、机械机电、家具装潢、建材行业、快销品、母婴用品、办公用品、汽配汽修、生鲜农贸、手机通讯、数码家电、医药用品、制造业、信息技术服务行业等。提供全部无加密服务端和前端源代码,独立部署,不受限制。

u011092458的博客 788

【Visual C++】游戏开发笔记三十八 浅墨DirectX提高班之六 携手迈向三维世界:四大变换展身手...

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。 文章链接:http://blog.youkuaiyun.com/zhmxy555/article/details/8408723 作者:毛星云(浅墨)邮箱:happylifemxy@163.com 本篇文章里,我们首先对Direct3D中固定功能渲染流水线相关概念进行了深入的剖析,然后介绍了创建三维游戏世界的四大变换的概念和使用的方方面面,...

轻轻草原 428

避开集成插件!手把手教你用URL登录实现Finereport与致远OA的无缝跳转

本文详细介绍了如何通过URL登录机制实现Finereport与致远OA的无缝跳转,无需复杂插件配置。文章涵盖用户体系同步、环境配置、URL登录核心设置及安全加固方案,特别适合企业数字化转型中BI工具与OA系统的轻量化集成需求。

weixin_29215815的博客 74

大模型的实践应用31-基于通义千问大模型改进台风和海浪预测研究,利用机器学习与通义千问结合的思路实现对台风和海浪预测分析

通义千问大模型是阿里巴巴云推出的一款大规模语言模型,旨在通过强大的自然语言处理能力提供更广泛的服务。从最初的构想到如今的广泛应用,通义千问的发展见证了人工智能领域尤其是自然语言处理技术的巨大进步。自发布以来,通义千问不断迭代升级,不仅在规模上实现了飞跃式的增长,在性能方面也得到了显著提升。本次研究尝试将通义千问强大的自然语言处理能力与经典的时间序列预测算法相结合,旨在提高对未来天气状况预测的精度。具体来说,首先使用通义千问生成高质量的文字描述来增强特征表达力;

微学AI的博客 934

Direct3D研究院之T&L流水线(五)

DirectX3D渲染图形的过程可分为两步:第一步为T&L过程;第二步为光栅化。光栅化,大家应该都知道,就是按照图形顶点信息设置对应像素的颜色,然后呈现在屏幕上的过程。而T&L,可能有些朋友不太了解,这一章,我们就来对T&L进行一下学习。 首先,要知道什么是T&L,T&L就是TransformingandLighting,即顶点的坐标变换和光照过程。通常被称为顶点变换流水线。 DirectX3D中图形的顶点的坐标系三维坐标系,而电脑屏幕是一个二维的平面,我们要..

翻肚鱼儿的博客 596

Jetson Thor平台JP7.0版本96712 GMSL相机驱动调试记录

摘要:本文档记录了在Thor Custom Board (JP7.0GA)上配置GMSL摄像头时遇到的视频流问题及调试过程。问题表现为视频设备(/dev/video11)能正常创建,但获取视频时出现"Internal data stream error",而相同配置在AGX Orin JP6.0上运行正常。通过梳理硬件拓扑、v4l2-ctl测试、提升时钟频率及分析内核日志,发现VI引擎未接收到帧数据包。调试步骤包括检查设备树冲突、调整I2C总线配置、修正通道名称,最终通过屏蔽传感器启动时

jzwjzw19900922的博客 1109

Direct3D学习笔记(二)——顶点坐标变换

Direct3D学习笔记(二)——顶点坐标变换 在Direct3D中,一个三维物体是被分成许许多多的三角形面来表示,而且是需要使用三维坐标来描述,但实际上显示器是一个二维表面,所以要想在二维显示器上显示三维物体就必须先将空间物体的三维坐标转换为二维坐标。 在Direct3D中有四种坐标,分别为 1、 世界坐标系 三维物体被划分为众多的三角形面表示后,物体表面的图行方位...

weixin_30502965的博客 210

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

顶点坐标变换(1)

空间中的物体需要使用三维坐标来描述,而显示器是一个二维的表面,所以在屏幕上渲染一个三维场景时,首先需要将描述空间物体的三维坐标变换为二维坐标(世界坐标到屏幕坐标),这在Direct3D中称为顶点坐标变换。顶点坐标变换通常通过矩阵来完成。可以把顶点坐标变换想象成摄像过程,三维世界的景物通过摄像机的拍摄显示在二维的相片上,所不同的是把相片换成了屏幕。 顶点坐标变换和光照流水线概述 Direct

296

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

顶点变换

本贴来自于 http://www.cppblog.com/lovedday/archive/2008/05/02/48632.html顶点坐标变换(5) 投影变换将摄影空间中的三维物体投影到二维胶片上,也就是Direct3D中的屏幕,这种三维到二维的变换过程就是投影变换,即从取景空间到摄影空间的变换。设三维物体在观察空间中的坐标为Pview,投影矩阵为Mproj,则顶点在投影空间中

894

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

HLSL顶点渲染

//============================================================== // Desc: 顶点渲染器代码 //========================================================

luckyboy101的专栏 1499

Direct3D-空间物体旋转demo

Direct9 物体旋转demo

Less Is More 2224

Direct3D9的绘制流水线

Direct3D的渲染过程大致可以分为以下几步 0. 模型表示 所有的三维实体都可以由有限的三角形mesh来逼近地表示 D3D绘制图形的最小单位(图元)通常为三角形mesh,但D3D也支持点图元和线图元(例如用于粒子系统) 为了描述一个三角形mesh,我们需要一个顶点列表,D3D中的顶点和数学上的顶点有所区别,除了数学上顶点所有的位置信息外,D3D的顶点还包含了光照,颜色,法向量等信...

a594896082的博客 372

3D游戏从入门到精通-5

21   使用Direct3D2.11.1最简单三角形显示前面已经学习了顶点、平面以及平面的法向量。接着下面就带你进入奇幻的3D世界,由你去创造这个美好的3D世界。任何美好的事物都是简单的东西组成的,所以也需要从最简单的物体构造开始。这里主要显示一个三角形,其它关于窗口和初始化D3D的设备都已经由MM3D引擎做好了,目前只要设置顶点、世界坐标变换矩阵、观察变换矩阵、投影变换矩阵,然

大坡3D软件开发 3544

顶点坐标变换和设置光照

四、顶点坐标变换和设置光照 1,顶点坐标变换 我们在计算机图形学里已经学过要显示一个三维景物模型,应用程序必须经历从世界坐标系到屏幕坐标系的转换,这里主要有三个坐标系及相应的变换:世界坐标系和模型几何变换,观察坐标系和取景变换,以及投影坐标系与投影变换。相关概念在我们大学《计算机图形学》的课程里已经有很清楚的讲解,这里主要说明在D3D中如何实现。 我个人对图形学中各种坐标变换的理解就是矩阵运...

weixin_34174132的博客 258
上一篇: 粒子系统基本原理 给出粒子中心点的坐标和粒子的大小,则很容易计算出粒子所需要的4个顶点的位置坐标。粒子系统由大量的粒子构成。每个粒子具有一组属性例如位置大小纹理颜色透明度运动速度加速度生命周期等属性。
下一篇: GPU图形绘制管线
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值