C# Direct3D编程 3D世界中的三角形(转)

本文介绍了Direct3D中的3D模型构成,包括World空间、View空间、光源和变换的概念。讲解了如何使用Matrix进行旋转、平移操作,以及如何设置View Transform和Projection Transform来模拟相机视角。通过代码示例展示了如何创建并显示一个3D三角形,以及如何通过SetupCamera()函数设置相机位置和视角,使三角形在屏幕上可见。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 那什么是真正的3D世界呢?或者说Direct3D的3D模型是什么样的呢?
  
  Direct3D的模型由World 空间,View 空间和光源组成。World空间就像我们现实生活中的空间一样,我们可以把物体放在这个空间的任何地方。但仅仅这样是不够的。因为现实中,我们是通过眼睛来看事物的,存在的东西不一定我们可以看得到,太远的东西看不到,被挡住的东西看不到,太近的东西也看不到,在我们视角以外的东西一样看不到。在Direct3D中用camera来模拟我们的眼睛。
  
  另外还有一个重要概念,transform,变换。在world空间中,我们可以把物体移动,旋转,这需要通过变换来实现。通过camera来决定我们最终能看到的那些东西时也是经过变换。在Direct3D中,变换是通过4x4的矩阵来实现的。
  
  不是搞算法的人没有必要了解矩阵的具体内容,可以通过Maxtrix中的静态函数来创建矩阵:
  
  Matrix.RotationX(), Matrix.RotationY(), Matrix,RotationZ(),创建分别围绕X,Y,Z轴旋转的矩阵。
  
  Matrix.Translation()用来创建移动物体的矩阵。
  
  而与camera相关的变换有两个,View Transform,和Projection Transform.View Transform用来定义camera的信息。而Projection Transform用来定义我们的可见范围,
  
  也就是说那些物体会被绘制到屏幕上去。
  
  另外一个很重要的概念就是光源,在真实世界中,没有光的情况下我们是看不到东西的,即使他存在。而且我们看到的物体的颜色/亮度,与光源的颜色/亮度,与他本身的材质/颜色都有关系。在Direct3D中也是如此,一旦一个物体在我们的可视范围内,并且没有被遮挡住,那么他能否可见,以及什么颜色/亮度,就由光源,物体的材质来决定了。
  
  下面就开始我们的例子。首先把我们的代码中的顶点格式,改成PositionColored格式。注意坐标哦,这里的坐标可不是屏幕坐标系了,而是World坐标系,是左手笛卡尔3D坐标系。第一步的代码如下:
  
  #region Using directives
  
  using System;
  
  using System.Collections.Generic;
  
  using System.ComponentModel;
  
  using System.Data;
  
  using System.Drawing;
  
  using System.

第 1 章 游戏开发和托管代码 .... 3 1.1 什么是.NET? ...... 3 1.2 什么是托管代码 ...... 5 1.3 使用 Microsoft Visual Studio .NET 2003 IDE 编写代码 ...... 5 1.3.1 C#代码 ..... 6 1.3.2 VB .NET 代码 ..... 8 1.4 在命令行中编译.NET 代码 ...... 9 1.5 游戏开发简述 ...... 10 1.6 开发人员 ...... 10 1.7 游戏开发过程 ...... 11 1.8 工具 ...... 12 1.9 小结 ...... 16 第 II 部分 图形和游戏 1 的介绍 第 2 章 策划第一个游戏 .... 19 2.1 提出游戏构想 ...... 19 2.2 理解一个 3D 游戏的需求 ...... 21 2.3 游戏规范 ...... 24 2.4 小结 ...... 26 第 3 章 理解示例框架 .... 27 3.1 创建项目 ...... 27 3.2 枚举所有设备选项 ...... 32 3.3 小结 ...... 39 第 4 章 在屏幕上显示 .... 40 4.1 创建设备 ...... 40 4.2 开始绘图 ...... 47 4.3 加载并绘制网格 ...... 48 4.4 在场景中添加照相机 ...... 51 4.5 小结 ...... 54 第 5 章 完成代码 .... 55 5.1 理解高分辨率计时器 ...... 55 5.2 处理丢失的设备 ...... 60 5.3 添加帧速率输出 ...... 63 5.4 设计 UI 界面 ...... 65 5.5 设计按钮 ...... 72 5.6 小结 ...... 75 第 6 章 实现用户界面 .... 76 6.1 设计主菜单 ...... 76 6.2 插入到游戏引擎中 ...... 81 6.3 选择人物(Loopy) .. 84 6.4 利用新界面更新游戏引擎 ...... 91 6.5 小结 ...... 95 第 7 章 实现玩家和块 .... 96 7.1 编写 Player 对象 ...... 96 7.2 设计块 ...... 104 7.3 小结 ...... 110 第 8 章 实现级别对象 .... 111 8.1 实现级别 ...... 111 8.2 控制玩家的移动 ...... 116 8.3 处理级别的更新 ...... 119 8.4 小结 ...... 123 第 9 章 综合应用 .... 124 9.1 包含玩家 ...... 124 9.2 挂钩级别 ...... 128 9.3 实现退出界面 ...... 132 9.4 结束工作 ...... 135 9.5 小结 ...... 140 第 III 部分 基本的数学规则 第 10 章 3D 数学快速入门 .... 145 10.1 2D 与 3D .... 145 10.2 使用 3D 点 ...... 147 10.3 操作 3D 对象 ...... 148 10.3.1 平移(移动)对象 ..... 149 10.3.2 缩放 ..... 149 10.3.3 旋 ..... 150 10.3.4 坐标系 ..... 150 10.4 数学结构 ...... 151 10.5 向量 ...... 151 10.6 矩阵 ...... 154 10.7 小结 ...... 157 第 IV 部分 间接图形、对等网、游戏 2 第 11 章 开始创建游戏 .... 161 11.1 Tankers—— 下一个游戏构想 ...... 161 11.2 创建 Tankers 项目 ...... 163 11.3 项目的图形绘制 ...... 169 11.4 为纹理构建对象池 ...... 171 11.5 小结 ...... 173 第 12 章 开发更先进的用户界面 .... 174 12.1 使用 Blockers 的基类(Base 类) .. 174 12.2 添加新的基类 ...... 179 12.3 实现主界面 ...... 182 12.4 利用用户界面绘制 3D 模型 ...... 189 12.5 小结 ...... 193 第 13 章 绘制真实的坦克 .... 194 13.1 理解网格层次结构 ...... 194 13.2 加载坦克层次结构 ...... 197 13.3 绘制网格层次 ...... 199 13.4 操作坦克 ...... 201 13.5 坦克的属性 ...... 204 13.6 创建照相机类 ...... 207 13.7 小结 ...... 210 第 14 章 天空?级别?玩家! .... 211 14.1 没有天空的世界将是黑色的世界 ...... 211 14.2 有了一个天空,但坦克不能驱动到那里 ...... 214 14.3 控制坦克 ...... 216 14.4 IMoveableObject 接口 ...... 225 14.5 基本碰撞检测 ...... 231 14.6 小结 ...... 234 第 15 章 准备,瞄准,开火! .... 235 15.1 实现 Ammunition 类 ...... 235 15.2 Bullets 集合 ...... 242 15.3 完成玩家 ...... 243 15.4 添加声音 ...... 245 15.5 小结 ...... 248 第 16 章 避免单人游戏的枯燥 .... 249 16.1 使用 DirectPlay ... 249 16.2 创建会话 ...... 255 16.3 加入会话 ...... 257 16.4 事件处理程序 ...... 258 16.5 发送及接收数据 ...... 260 16.6 小结 ...... 265 第 17 章 完成 Tankers 游戏 .... 266 17.1 插入到游戏引擎中 ...... 266 17.2 绘制游戏 ...... 272 17.3 小结 ...... 275 第 V 部分 高级绘图、客户/服务器网络和游戏 3 第 18 章 添加特殊效果 .... 279 18.1 实现基本粒子系统 ...... 279 18.2 绘制粒子系统 ...... 287 18.3 将各部分连接到一起 ...... 290 18.4 小结 ...... 292 第 19 章 构建自己的游戏 .... 293 19.1 阐明思想 ...... 293 19.2 创建自己的项目 ...... 294 19.3 设计用户界面 ...... 300 19.4 小结 ...... 305 第 20 章 可编程流水线 .... 306 20.1 定义可编程流水线 ...... 306 20.2 使用 HLSL ... 307 20.3 编写 Vertex Shader .. 309 20.4 使用着色增加逼真度 ...... 314 20.5 添加 Pixel shader .. 315 20.6 小结 ...... 317 第 21 章 控制细节的级别 .... 318 21.1 简化网格 ...... 318 21.2 使用简化的网格 ...... 322 21.3 使用渐进网格控制细节的级别 ...... 323 21.4 小结 ...... 324 第 22 章 使用绘图目标创建特效 .... 325 22.1 绘制跑道和多辆卡丁车 ...... 325 22.2 创建绘图目标和表面 ...... 331 22.3 将场景绘制到绘图目标 ...... 333 22.4 演示后视镜 ...... 334 22.5 小结 ...... 335 第 23 章 理解高级渲染语言 .... 336 23.1 理解老的 shader 模型的限制 ...... 336 23.2 添加卡丁车镜面高亮 ...... 337 23.3 逐 pixel 镜面高亮 ...... 340 23.4 小结 ...... 343 第 24 章 关于性能的注意事项 .... 344 24.1 事件模型和 Managed DirectX .... 344 24.2 生成本机程序集 ...... 345 24.3 Boxing 恶梦 ...... 346 24.4 Managed DirectX 的速度 ...... 348 24.5 理解方法的开销 ...... 349 24.6 小结 ...... 350 第 VI 部分 附 录 附录 A 开发级别创建器 .... 353
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值