左右手坐标系

众所周知,OpenGL使用的是右手坐标系,而Direct3D使用的是左手坐标系。

除了上面Z轴的方向不一样外,左右手坐标系的还有其他区别:

正向旋转方向:在左手系中用Left-Hand Rule判别,正方向是顺时针方向。在右手系中,用Right-Hand Rule判别,是逆时针方向。

叉积的方向:在右手坐标系中,叉积的方向通过Right-Hand Rule确定,而在左手坐标系中,叉积的方向则由Left-Hand Rule 确定。

World Space 坐标系

World Space 是定义物理世界位置的客观空间,Left hand 和 Right hand只是提供了两种不同的描述空间的方法,但描述的都是同一个世界。左右手坐

标系之间的转换并没有改变所描述的世界,真实世界中的时钟不管是在左手系还是右手系,都是按照顺时针方向旋转的。

View坐标系

无论是左手系还是右手系,World坐标系都描述了同一个世界空间,而你这么观察这个客观的世界空间,就取决于你所使用的坐标系了,这是OpenGL跟

Direct3D最主要的差别。下面先看个例子,

摄像机设置都是EyePos(0, 0, 15), LookAt(0, 0, 0), UpVec(0, 1, 0),红色方块的位置都是(-3, 0, 0),绿色方块的位置都是(3, 0, 0),

那么为什么OpenGL跟Direct3D是左右颠倒的呢?个人觉得是因为View坐标系是左手还是右手的关系,在Direct3D中,View空间坐标系是Left Hand,

Z轴就是ViewDirection(Lookat - EyePosition),当摄像机在(0,0,15)的地方往原点看的时候,确实是(-3,0,0)处红色的方块出现在(3,0,0)

出绿色方块的右边。而在OpenGL中,View空间坐标系是Right Hand, Z轴其实是-ViewDirection, 所以结果就是红色的方块出现在绿色方块的左边。

由此可见,左右手坐标系其实是左右颠倒的两个世界。

左右手坐标系的转换

上面也看到了,左右手坐标系渲染出来的2D图像结果是不一样的,左右颠倒,那如何使左右手坐标系渲染出相同的2D图像呢,有两种方法。

方法一:反转所有Vertex的X轴坐标和Camera的X坐标,左右手坐标系其实是左右颠倒的两个坐标系。

方法二:对用左右手坐标系渲染出来的2D图像进行水平方向上的反转。

在Modern OpenGL 中使用左手坐标系

众所周知,在固定管线的OpenGL中只能使用右手坐标系,OpenGL并没有提供API让你在左右手坐标系中切换。而在可编程管线的OpenGL中,就没有那么

多限制了,所有的Vertex Transform都由你来控制。事实上,你直接把左手坐标系的顶点和矩阵传给OpenGL Shader也是没有问题的,在Vertex Shader

使用mul(v, matrix)变换顶点,得到的会是跟Direct3D同样的结果。注意是跟Direct3D同样的结果,而不是跟固定管线OpenGL相同的结果,事实上,正如

上面所说,左右手坐标系渲染的结果的左右颠倒的。唯一要区别的是Viewport的Z,在OpenGL中,裁剪空间的Z坐标是[-1. 1],而在Direct3D中是[0, 1],

而经过Viewport变化后,不管是OpenGL还是Direct3D, Z都是[0, 1], OpenGL的视口变化是 Z=(Z/W + 1) / 2 ,而Direct3D是Z=(Z/W),这对Depth

Test不受影响,Depth Test只比较相对位置远近,但Depth Buffer的值就不同了。所以需要对project matrix做一些调整,才能让他们写到depth buffer中

的数值相同。具体来说,如果要让OpenGL流水线接受D3D的project matrix,就需要乘上

相当于把project space的顶点z都作了z = z * 2 – 1的操作,所以经过viewport变换就一致了。

OpenGL: 你不知道的左右手坐标系的更多相关文章

  1. OpenGL(四) 左右手坐标系及基本坐标变换

    左手坐标系.右手坐标系.笛卡尔坐标系 左手坐标系:伸开左手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向. 右手坐标系:伸开右手,大拇指指向X轴正方向,食指指向Y轴正方向,其他 ...

  2. Cocos2d-x 核心概念 - 坐标系(UI.OpenGL.世界坐标系.模型坐标系)

    UI坐标系与OpenGL坐标系 UI坐标就是Android和IOS等应用开发时候使用的二维坐标系,原点在左上角 OpenGL坐标是三维坐标,由于Cocos2d-x Lua 底层采用OpenGL渲染,因 ...

  3. OpenGL中各种坐标系的理解[转]

    OPENGL坐标系可分为:世界坐标系和当前绘图坐标系. 世界坐标系:在OpenGL中,世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的.你面对 屏幕,你的右边是x正轴,上面是y正轴,屏幕 ...

  4. OpenGL中各种坐标系的理解

    转载:https://blog.csdn.net/meegomeego/article/details/8686816 OPENGL坐标系可分为:世界坐标系和当前绘图坐标系. 世界坐标系以屏幕中心为原 ...

  5. 左右手坐标系转换时R和T的具体形式分析

    本文介绍了在计算机视觉的一些应用中,左手坐标系和右手坐标系之间转换时,旋转矩阵R和平移向量T的具体表达形式有哪些变化.

  6. [OpenGL]OpenGL坐标系和坐标变换

    OpenGL通过摄像机的模拟.要实现一个三维计算机图形重大转变,这是几何变换(模型转换-查看转型(两者统称为几何变换)).投影.作物转型.口变换等.同一时候,OpenGL还实现了矩阵堆栈等.理解掌握了 ...

  7. OpenGL中摄像机矩阵的计算原理

    熟悉OpenGL|ES的朋友,可能会经常设置摄像机的view矩阵,iOS中相对较好,已经封装了方向,只需要设置摄像机位置,目标点位置以及UP向量即可.下面先介绍下摄像机view矩阵的计算原理.此处假设 ...

  8. 统一D3D与OpenGL坐标系统

    作者:游蓝海(http://blog.csdn.net/you_lan_hai) DirectX 3D与OpenGL坐标系统的差异性,给我们带来非常大的麻烦.让跨平台编程的新手非常困惑.近期在做一个跨 ...

  9. Unity 中的坐标系

    说明: 注意几点: 0 行向量右乘矩阵与列向量左乘矩阵,两个矩阵互为逆矩阵 1 法线转换与mul,mul函数左乘矩阵当列矩阵计算,右乘当行矩阵计算 2 叉乘与左右手系,左手系用左手,右手系用右手,ax ...

随机推荐

  1. 二叉排序树实现(C++封装)

    设计思路 设计一个类,根结点只可读取,具备构造二叉树.插入结点.删除结点.查找. 查找最大值.查找最小值.查找指定结点的前驱和后继等功能接口. 二叉排序树概念 它或者是一棵空树:或者是具有下列性质的二 ...

  2. 【LOJ】 #2132. 「NOI2015」荷马史诗

    题解 k叉哈夫曼树,但是没有了二叉那样的最后一定能合并成一个树根的优秀性质,我们就不断模拟操作看看到了哪一步能用的节点数< k,然后先拿这些节点数合并起来 然后就可以k个k个合并了,大小一样先拿 ...

  3. Android之 广播

    (以下内容是阅读郭霖大神的<第一行代码>后自己总结的) 1.概述 广播是Android的四大组件之一. Android的广播机制十分灵活. 2.发送广播 如上图Android的广播主要分为 ...

  4. Java常用工具类之RegexpUtils,正则表达式工具类

    package com.test.core.util; import org.apache.log4j.Logger; import org.apache.oro.text.regex.Malform ...

  5. Calendar日期方法

    面试居然让我获取当前月份第一天跟最后一天,主要是尴尬的回答不上来. 废话不说,直接贴代码,工作应该是够用了 public class TestCalendar { // 日期也就是这了 public ...

  6. Kuhn-Munkres算法

    KM算法——二分图最大权匹配 我们前面学过了二分图匹配的匈牙利算法.但这种算法是针对没有权值的图来说的. 肯定有人想问,没有权值的用匈牙利算法,哪有权值的图要求最大权或最小权匹配呢?? 这里就引出了我 ...

  7. Xamarin Android权限请求

    Xamarin Android权限请求   Android权限规定了App是否可以访问特定的资源,如网络.电话和短信.在原有API 6.0之前,App在安全的时候,会请求一次权限.一旦安装后,App就 ...

  8. IDC、ICP、ISP区别

    ICP( Internet Content Provider):网络内容服务商,即向广大用户综合提供互联网信息业务和增值业务的电信运营商.其必须具备的证书即为ICP证,如运营一个网站,需要进行备案获取 ...

  9. Hibernate.cfg.xml详解

    在搭建Hibernate环境时需要配置Hibernate.cfg.xml配置文件,本文将想详细讲解配置文件的内容. 1.数据库连接信息 配置数据库驱动.(其中name为连接方式,我在这写jdbc的连接 ...

  10. Nginx -- nginx.conf 配置文件详讲

    Nginx服务器配置,nginx.conf文件代码详讲,结合不同楼主的博文得到: #关掉访问日志可以优化服务器 #定义Nginx运行的用户和用户组 #user nobody; #nginx进程数 #如 ...