x轴z轴代表的方向图片_游戏中到底是Z轴朝上还是Y轴朝上?

c8f723529e73514ee12e1b4655a109ac.png
本文转自我的公众号——游戏开发那些事

在谈到游戏世界中的坐标轴时,我们经常会看到这样的争论。

“游戏中Y轴是向上的好么?这你都不知道?”
“不对,空间直角坐标系不就是Z轴向上的么?”
“拜托,请搞清楚坐标系再来讨论好么?”.....

对于长期接触Z轴向上的空间直角坐标系的我也存在着同样的困惑,左右手坐标系已经够让人头大了,为什么连哪个轴向上都不能统一一下?而后当我试图通过搜索引擎寻找答案时,发现这个问题确实有不少人在讨论,也终于搞清楚了其中的缘由。

762cde6e0ce05b73a00da730a10fa80c.png

8905c420c716c4a488a53237258449ec.png

故事可能要从著名的三维建模软件3DS Max说起。3DS Max是公司AutoDesk第一款建模软件,它于1990年发布,主要用于设计和建筑领域。

16e76eed47adc8ebbf111fc4addbeadc.png

在建筑学中,通常要先从平面图开始设计,所以先在2D网格上绘制X轴和Y轴,随后在将其拉伸成3D模型。很自然的,他们将下一个轴设置向上,即在3DMAX里面向上的便是Z轴(Z-Up)。这种思路与我们在学校时第一次从平面几何踏入空间几何的想法完全契合。

e98ab62afd0a0b044f2666ef61850267.png

而在1998年,另一款著名的建模软件——Maya诞生了。Maya一开始主要作为动画软件系统发行,广泛用于动画电影当中。

acba225f9a0a9de8f8b2a6f2c38152d0.png

与建筑领域相似,当时的动画通常也是2D的,即正面看Y轴向上,X轴向右。不过早期的迪士尼和其他动画作品为了能在不改变2D画面效果的条件下增加维度(例如2D平台游戏),保留了X轴和Y轴的朝向,新增的Z轴便成为了深度。当然,这里也有一定程度的历史原因——由于Maya一开始为SGI的(硅谷图形公司Silicon Graphics, Inc.)硬件开发,SGI早期提供的渲染引擎就是Y轴向上的,所以Maya就跟随SGI的标准制定坐标系(Y-Up)。

078deb481e1055decb3094eb27bcdf09.png

其实,造成这种差异的根本原因在于你是在屏幕空间中思考还是在世界空间中进行思考。
在屏幕空间中,给定X和Y的屏幕坐标,将Z作为深度可以方便的处理遮挡问题(即Y-Up)。许多渲染技术(DX、OpenGL)都使用“ Z缓冲区”之类的名称的来处理屏幕空间渲染(三维空间的渲染最后还是会输出到屏幕空间)。很明显,在二维环境中,Y轴向上的坐标系更有意义一些。

1cc00989586905a8714e83873c984100.png

然而在世界空间中,我们通常希望像现实一样构建三维的世界。正常的三维空间示意图都将第三个坐标视为垂直方向的(即Z-Up)。要在世界空间中定义一个矩形,则要给出其长、宽、高。如果将Y视为垂直方向,那么就会陷入了一种不符合常识的情况,与我们多年来接触的笛卡尔坐标系相悖。

6895e754884b441897caa1e35f6afba9.png

当你仔细调查一下目前流行的软件时,你会发现不同的软件其坐标系默认都是不一样的。除了前面提到的两款三维建模软件,另外两款著名的游戏引擎Unity与Unreal也有着不同的坐标系。受到历史因素的影响,Unreal诞生时3DS Max是当时大多数开发人员选择的建模工具包(Maya还没有诞生),所以采用了Z轴向上的左手系坐标。而Unity3D在2000以后才正式发布,采用的则是Y轴朝上左手坐标系。

045bdaeb964dd59d916038e7693dca0c.png

由于标准的不同,导致我们在使用不同游戏引擎以及不同建模软件交互时需要手动处理坐标系的转换。而对于那些只接触过部分软件的人往往会保留“Z轴向上”或者“Y轴的向上”的固有印象,从而造成了前面提到的争论现象。无论哪种坐标系,都有其一定的道理,我们理解其中的缘由并能灵活的运用即可。

最后,再帮大家复习一下左手坐标系和右手坐标系(挥动双手的同时不妨点个赞支持一下)。

7cda5e968f16e4ec65bd8d1c0cd7af70.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

补发《超级迷宫》站立会议三

那天我给自己的任务是实现控件的控制,但结果明显很不理想,我仅仅加载了两个控件(即两个小人),一个是玩家,另一个是守关者,玩家控制基本实现,通过方向键进行控制;但守关者…

mysql003三表查询.三表查询.自链接查询

-- 多表查询 三表查询 -- 查询员工的编号,姓名,薪水,部门编号,部门名称,薪水等级 -- 可以先两表查询,在修改成三表查询 -- 第一行查询的内容,第二,三行查询需要的表, -- 和条件…

[转]jQuery源码分析系列

文章转自:jQuery源码分析系列-Aaron 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://github.com/JsAaron/jQuery 正在编写的书 - jQuery架构设计与实现 本人在慕课网的教程(完结) jQue…

hook xposed 自定义类_【开始学习React Hook(1)】Hook之useState

react hook是react推出的一种特殊函数。这些函数可以让你在不创建react class的情况下依然可以使用react的一些特性(诸如目前react的钩子函数拥有的所有特性)。最常用的hook有useState, useEffect, 日常开发使用这两个就足够了。如果再懂点useReduer, us…

mysql004子查询.相关子查询.不相关子查询

子查询:相关子查询,不相关子查询 -- 不相关子查询 -- 一条SQL语句含有多个select,先执行子查询,在执行外部查询。子查询可以独立运行,成为不相关子查询。 -- 需求1:查询所有比姓名为“CLARK”工资高的员工的信息。 …

文件无刷新上传(swfUpload与uploadify)

文件无刷新上传并获取保存到服务器端的路径 遇到上传文件的问题,结合之前用到过的swfUpload,又找了一个无刷新上传文件的jquery插件uploadify,写篇博客记录一下分别介绍这两个插件的实现方法 swfUpload 导入swfUpload的开发包 添加js引用&am…

ediplus 复制编辑一列_vi编辑器的使用详解

一个编辑器具备的功能一个编辑器(例如Windows中的记事本)具备的功能:打开文件、新建文件、保存文件光标移动文本编辑(多行间|多列间)复制、粘贴、删除查找和替换vi编辑器的环境设置为了更方便的使用vi编辑器,我们需要先对vi编辑器进行一些配置。打开虚拟…

myjdbc链接数据库.增删改查

-- 创建user表 CREATE TABLE user( uid int PRIMARY KEY auto_increment, uname VARCHAR(55), pwd VARCHAR(55), realName VARCHAR(55) ) SELECT * FROM user; Jdbc增删改查 package myjdbc; import java.sql.Connection; import java.sql.DriverManager; import java.…

JAVA中通过时间格式来生成唯一的文件名

有时候我们需要截图,在要截图时,有人用到了时间格式,但是时间格式中的:在文件名称中是不被允许的字符,所以就会报错,如何生成唯一的时间文件名: package com.demo;import java.text.ParseException; import…

python返回字符串长度的函数_Python如何查找字符串的长度?(代码示例)

在Python中字符串是Unicode代码点的不可变序列。给定一个字符串,我们如何查找它的长度?本篇文章就来给大家介绍在Python中查找字符串长度的四种方法,希望对大家有所帮助。【相关视频教程推荐:Python视频教程】方法一:使…

K-means算法和矢量量化

语音信号的数字处理课程作业——矢量量化。这里采用了K-means算法,即假设量化种类是已知的,当然也可以采用LBG算法等,不过K-means比较简单。矢量是二维的,可以在平面上清楚的表示出来。 1. 算法描述 本次实验选择了K-means算法对数…

docker 主进程 日志_运维笔记--docker高效查看后台日志

场景描述:应用程序运行在 Docker环境中,经常使用的查看后台日志的命令是:docker attach 容器名该命令优点:实时输出;不足之处:日志大量输出的时候,屏幕一闪而过,不便于调试&#xff…

jdbc.properties文件

drivercom.mysql.cj.jdbc.Driver (//主机:端口号、数据库名)urljdbc:mysql://localhost:3306/mydb?useSSLfalse&useUnicodetrue&characterEncodingutf8&serverTimezoneAsia/Shanghaiusername(链接的用户)passwd(密码)

ifix如何设画面大小_如何让你的视频又小又清晰?视频编码输出软件来了

如何让视频保持清晰同时又让其体积尽可能的小?这是很多小伙伴们都很头疼的问题而且很多时候我们需要会在微信或者朋友圈等社交平台上传我们的作品但它们对视频大小有着比较严格的控制所以蜜蜂菌就为大家带来了视频压缩神器小丸工具箱帮助你轻松压缩出又小又清晰的视…

智能集群理论优化控制_探索群体智能的奥妙——ROB-MAS多智能体协作

人类对未知领域总是充满好奇和敬畏。因为好奇,所以不断探索,因为敬畏,所以小心谨慎。谈到人工智能,已经不仅仅是停留在智能手机、家用电器这个层次,要知道,人工智能的作用,不仅仅是为了方便生活…

mybatis.xml文件

mybatis.xml <?xml version"1.0" encoding"UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>&l…

note同步不及时 one_朱海舟回应锤子便签同步不及时:工程师已经解决

集微网消息(文/数码控)&#xff0c;有不少网友反映自己用的锤子便签没法及时同步数据&#xff0c;对此锤子科技产品经理朱海舟回应称工程师已经把该问题解决&#xff0c;用户只需更新APP即可。至于部分安卓用户无法同步锤子便签数据的问题&#xff0c;也很好解决&#xff0c;只…

NEC学习 ---- 模块 - 带点文字链接列表

带点文字链接列表, 实现的效果是, 调整字体大小, 点的位置不会跟着变动. HTML如下: <div class"container"><div class"m-list2"><ul><li><i class"dot"></i><a href"#">带点文字链接列表…

shell复习笔记----命令与参数

shell最基本的工作就是执行命令. 每键入一道命令, shell 就会执行. $cd work;ls -l whizprog.c 首先:格式很简单,以空白(Space 键或者 Tab键)隔开命令行中的各个组成部分. 其次,命令名称是命令行的第一个项目.通常后面会跟着选项(option),任何额外的参数(argument)都会放在选项…

enkey java_近期的Java项目(前端)

1.项目名&#xff1a;栏目选择框(前端)2.项目源码--话不多说&#xff0c;直接附上源码吧&#xff0c;感受会更直观一些package java项目;import java.awt.BorderLayout;import java.awt.Container;import java.awt.FlowLayout;import javax.swing.ButtonGroup;import javax.swi…