OpenGL 默认的Z轴方向问题

OpenGL默认的Z坐标轴的方向是垂直窗口向外的,以前用C语言开发OpenGL程序时一直没有出现问题。现在我用C#开发OpenGL程序,却发现默认的Z轴方向是垂直窗口向内,真的搞不懂怎么回事。我没有使用模型变换和投影变换,仅仅是是在窗口绘制两个简单的图形,发现Z坐标为负的图形可以看得见,而Z坐标为正的图形却被覆盖。已经开启了深度测试。代码如下:

         void Draw()
        {
            GL.glEnable(GLCONST.GL_DEPTH_TEST);
            GL.glClear(GLCONST.GL_COLOR_BUFFER_BIT);
            GL.glClear(GLCONST.GL_DEPTH_BUFFER_BIT);

           //红色的三角形,Z=0;
            GL.glBegin(GLCONST.GL_TRIANGLES);
            GL.glColor3(1f, 0f, 0f);
            GL.glVertex3(-0.5f, -0.5f,0f);
            GL.glVertex3(0.5f, -0.5f,0f);
            GL.glVertex3(0f, 0.5f,0f);
            GL.glEnd();

           //绿色的直线,Z=-0.5
            GL.glColor3(0f, 1f, 0f);
            GL.glBegin(GLCONST.GL_LINES);
            GL.glVertex3(-0.8f, 0f, -0.5f);
            GL.glVertex3(0.8f, 0f, -0.5f);
            GL.glEnd();

           //蓝色的直线,Z=0.5
            GL.glColor3(0f, 0f, 1f);
            GL.glBegin(GLCONST.GL_LINES);
            GL.glVertex3(0f, 0.8f, 0.5f);
            GL.glVertex3(0f, -0.8f, 0.5f);
            GL.glEnd();
            GL.glFlush();

        }

绘制时,发现红色的三角形(Z=0)会把蓝色的直线(Z=0.5)掩盖,而绿色的直线(Z=-0.5)浮在三角形之上。效果如下图:
图片说明

这种问题,似乎有不少人遇到,但都没有的到很好的解决。特此悬赏160金币,希望有人能解决。只要提供解决的方法,或者给予启示,或者提供线索都可以获得悬赏。

0

5个回答

该问题无人能正确解答,也没有提供有用的思路和线索,所以我撤回这个问题

0

楼主既然都没有进行模型变换和投影变换,那么默认视点是在原点,方向指向z负轴,
这种情况下,蓝色和绿色的线应该只有一条可以看到。
可是结果却是两条都显示了。
这个显示图的视点在z负轴,而且方向是指向z正轴的。
确定没有使用设定视点的函数吗?LookAt这种的?

1
feihero
feihero 回复要上天的拉布拉多: 好吧,刚刚自己在vs中实现了下,确实遇到了这种结果。然后找了下原因:默认情况(没有进行模型视角设置),在现实窗口显示的视景体范围是[-1,1)的平行投影。也就是一个顶点为(±1,±1,±1)的正方体。这样一来,就与实验结果吻合了,z值比较小的,深度浅。绿色覆盖蓝色。
一年多之前 回复
qq_28249373
要上天的拉布拉多 所有OpenGL代码都在上面了。没有设置投影、观察矩阵,也没有进行任何的平移、缩放和旋转,所有的都是默认的。
一年多之前 回复

都没有的到很好的解决。特此悬赏160金币,希望有人能解决。只要提供解决的方法,或者给予启示,或者提供线索都可以获得悬赏。

0

这个猜测是由于颜色叠加引起的,蓝色绘制在红色之上,肉眼看去好像蓝色不存在一样。
如果想让蓝色看到,建议在绘制红色三角形时,分两步绘制,绘制两个三角形,中间留出一条空白用来绘制蓝线。

0
qq_28249373
要上天的拉布拉多 并非是颜色叠加问题,取消深度测试还是可以看得见的
一年多之前 回复

楼主没有设置projection矩阵,也没有model view变换,那么楼主直接将顶点设置在了opengl默认的clip space中(或者说NDC中,尽管两者还差一个透视除法)。下面是重点:
opengl的NDC是左手坐标系,因此x轴向右,y轴向上时,z轴向内。因此绿色的线在最前面。
楼主可以看看《webgl编程指南》这本书的附录,有一张专门讨论OpenGL 是右手还是左手系的,里面提到的问题和楼主的类似。

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
OpenGL边用边学------2 经典照相机模型
实际照相步骤n1 布置场景和调整照相机位置n3 选择镜头对焦Focusn4 按下快门n5 在电脑窗口中欣赏图片nOpenGL的相机模型n0 确定胶片位置n1 确立场景世界坐标系n2 在世界坐标系中确定相机位置与方向n3 在世界坐标系中建立物理世界模型n4 视图变换与模型变换的抉择n5 在照相机坐标系中确定可视范围对焦投影变换n6 调用glBegin glEnd拍照nOpenGL相机模型与实际相机的
Qt|OpenGL学习笔记-绕X轴、Y轴、以及XY轴旋转的四边体
程序运行截图如下:nnnn nn源码如下:nnmyglwidget.hnnn#ifndef MYGLWIDGET_Hn#define MYGLWIDGET_Hnn#include <QWidget>n#include <QOpenGLWidget>nclass QTimer;nnnclass MyGLWidget : public QOpenGLWidgetn{n Q...
OpenGL(四) 左右手坐标系及基本坐标变换
左手坐标系、右手坐标系、笛卡尔坐标系nnn左手坐标系:伸开左手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。n右手坐标系:伸开右手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。n左右手坐标系的示意图如下:nnnnnnn左手和右手坐标注系的区别在于两者Z轴的方向是相反的。n在高等数学中使用的三维空间是笛卡尔坐标系,如下:
Android Z轴布局
如果需要在布局中创造一个层叠的概念,那么使用Android系统中的ViewGroup是不够的,但是可以通过改变ViewGroup的绘制顺序实现n继承自FrameLayoutFrameLayout已经帮我们实现了子View的measure和layout过程,我们只需在它的基础上改变绘制顺序即可自定义LayoutParamslayoutParams的作用是向父布局请求布局参数(MeasureSpec),
OpenGL纹理上下颠倒翻转的三种解决办法
综述在使用OpenGL函数加载纹理到图形时,经常遇到纹理上下颠倒的问题。原因是因为OpenGL要求纹理坐标原点在图片最下面,如图: n n而图片信息中的原点一般都在最上方,一行行记录下来的,就会导致整个图片上下颠倒了。 n如图: n n从这个思路触发共有三种办法解决问题:一.翻转顶点信息中的纹理坐标原始顶点如图: n n因为纹理坐标的范围是0-1,所以翻转的话都统一用1去减 n得到正确的图片: n二
第4章 学习Shader所需的数学基础(上)(坐标系、点和矢量)
计算机图形学之所以深奥难懂,很大原因是在于它是建立在虚拟世界上的数学模型。数学渗透到图形学的方方面面,当然也包括Shader。在学习Shader 的过程中,我们最常使用的就是矢量和矩阵(即数学的分支之一一一线性代数)。n很多读者认为图形学中的数学复杂难懂。的确,一些数学模型在初学者看来晦涩难懂。但很多情况下,我们需要打交道的只是一些基础的数学运算,而只要掌握了这些内容, 就会发现很多事情可以迎刃
openGL按照载体自身坐标系旋转
openGL坐标系旋转nnnnnn立方体在openGL下可以使用glRotatef(angle, x, y, z)进行旋转,但是此时的坐标系是固定的世界坐标系,比如说立方体绕z轴旋转某一角度后,立方体的x和y轴已经改变,但是此时如果想按照立方体本身的y轴旋转,使用glRotatef(angle, 0, 1, 0)后立方体仍然按世界坐标系的y轴旋转。如何能让立方体按照自身的坐标
opengl物体绕着任意轴旋转解决方法
opengl中,物体绕着任意轴旋转,采用一个平移矩阵,再用旋转矩阵进行相乘,实际上总是绕着物体的中心坐标值进行旋转的,没法绕着世界坐标中心进行旋转。原因:矩阵只是进行坐标变换,并没有真正的改变物体的各个顶点坐标,所以和矩阵相乘平移后实际上原始坐标没有变化,再进行旋转矩阵相乘,物体还是会围绕自己的中心旋转而已解决方法:先平移时候直接在各个顶点坐标上加上一个平移偏移值,这样就是真正改变物体的世界坐标值...
css3中3d旋转中rotatex,rotatey,rotatez的旋转正方向
rotatex、rotatez的旋转正方向是顺时针,rotatey的旋转正方向是逆时针。
安卓开发——详解camera.rotate(x,y,z);的旋转方向
我之前的博客有简单介绍camera类的一些简单方法,其中有一个执行旋转操作的方法rotate(x,y,z),关于x,y,z取正负不同值时(x,y,z都是指角度),图像是如何旋转的呢?rn下面通过实际效果图,大家自行体会:rnmCamera.rotate(0,0,0);//效果如下rnrnrnmCamera.rotate(40,0,0);//效果如下rnrnrnrnmCamera.rotate(-4
Android立体旋转动画实现与封装(支持以X、Y、Z三个轴为轴心旋转)
本文主要介绍Android立体旋转动画,或者3D旋转,下图是我自己实现的一个界面rnrnrnrn rnrn立体旋转分为以下三种:rnrn  1. 以X轴为轴心旋转rnrn  2. 以Y轴为轴心旋转rnrn  3. 以Z轴为轴心旋转--这种等价于android默认自带的旋转动画RotateAnimationrnrn rnrn实现立体旋转核心步骤:rnrn  1. 继承系统Animation重写app
OpenGL中平移函数glTranslatef()、旋转函数glRotatef()的理解
void glTranslatef(GLfloat x,GLfloat y,GLfloat z);rnrn函数功能:沿X轴正方向平移x个单位(x是有符号数)rnrn  沿Y轴正方向平移y个单位(y是有符号数)rnrn  沿Z轴正方向平移z个单位(z是有符号数)rnrnrnvoid glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLfloat z);rnrn
从X,Y,Z三个方向显示CT序列
function main()n%MAIN Summary of this function goes heren% Detailed explanation goes heren% files=dir('*.dcm');n%nnclear allnclcnclose allnnthreedarray=NaN; %Records when numbered keys are pressednc
OpenGL ES总结(二)OpenGL坐标变换之平移及旋转
世界坐标系:n在OpenGL中,世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的。你面对屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。长度单位这样来定:窗口范围按此单位恰好是(-1,-1)到(1,1),即屏幕左下角坐标为(-1,-1),右上角坐标为(1,1)。 n n nopenGL使用右手坐标 n从左到右,x递增 n从下到上,y递增 n从远到近,z递增 当前绘图坐标系:
手动写绕任意轴旋转opengl代码
手动写绕任意轴旋转opengl代码 opengl , 绕任意轴旋转, 使用矩阵 这是老师布置的一个opengl作业
quat的坐标系转换
oculus获取的pose数据包含坐标和四元数信息,但所处的坐标系和CryEngine坐标系不同nnnnoculus坐标系 :+x向右,+y向上,+z向外(屏幕外)ncryengine坐标系:+x向右,+y向内(屏幕以内),+z向上n所以需要使用Oculus时,获取的相机位置和四元数都需要进行转换。n坐标转换比较好理解:将z轴和y轴对调再取反即可nVec3 Device::HmdV
Unity获取物体自身坐标轴的方向以及沿着该方向运动的方法
有时候对于一个游戏对象,需要其沿着自身的坐标轴方向进行运动,那么首先如何获取自身的坐标轴方向?rn获取自身的坐标轴方向可以通过transform组件进行获取(负方向加负号即可)rn Vector3 moveDirection = transform.right;  获取自身的x轴的方向rn Vector3 moveDirection = transform.forward;  获取自身的z轴的方向
Unity7--键盘按键、沿Z轴移动来回循环、PingPong用法
一、创建个TransformTest文件rnrn  //GameObjectrn和Transform虽然都可以得到名字但有区别--------------写在最上边的代码rn    publicGameObject obj1;rn    publicTransform obj2;rn    //4对应的代码rn    //如果int Flagrn是1,就正方向移动rn    int intFlag
Unity对象up轴指向目的方向进行旋转
今天想搞个人物旋转,但是需求比较特殊,坐标轴整体旋转了90度(ARToolKit的神奇设定),如果正常情况下最简单的做法就是LookAt方法或者Quaternion.FromtoRotation方法就可以直接搞定了,然而坐标旋转90度之后,相当于up方向为人物的面朝方向,所以直接用这两个方法就不行了,这两个方法都是默认的让物体的forward轴指向目标物体,所以要自己实现一套LookAt方法,使物
unity3D物体在UI平面中单击移动和旋转(Z轴转动)
程序版本 :unity 5.5.0f3 3D物体在2D平面中移动旋转
unity中两物体之间的锚点-X,Y,Z轴始终处于平行和对齐状态
最近遇到一个问题是两个处于不同位置方向的物体怎样才能让他的锚点,也就是X,Y,Z轴始终处于平行状态。经过好几天的查阅资料发现了方法。如下:nnusing System.Collections;nusing System.Collections.Generic;nusing UnityEngine;nnpublic class Test : MonoBehaviour {n    private V...
unity 沿着轴(x,y,z)拖动物体
nn nnusing System.Collections;nusing System.Collections.Generic;nusing UnityEngine;nn//选择轴向npublic enum axisPostionn{n    x_dir,n    y_dir,n    z_dir,n}nnpublic class DrageThree : MonoBehaviourn{nnn  ...
【Android】你可能还不知道的elevation、以及Z值等
Android你可能还不知道的elevation以及Z值等nelevation以及Z值是什么n有什么用处呢n影响View的阴影n影响View相互阻挡顺序n还有CardView
左手坐标系 和右手坐标系的差异, DX是左手坐标系, OPENGL是右手坐标系
rn rn左手坐标就是z轴向里 rn右手坐标就是z轴向外rn rn rn用你们的手来比一下就知道了 rnx轴和y轴的方向不变,用大拇指向x方向,食指指向y轴的方向,那么中指指向的方向就是z的方向rn rn rn转换就是把z的方向换一下就是了 rn关于为什么要使用2中,我也不知道 rn在d3d中用的是左手坐标系,opengl中用的是右手坐标系 ...
OpenGL绘图过程中,平移后再次旋转,旋转中心为什么变了?
1、问题现象:绘制完三维模型后,直接旋转模型,旋转中心在模型的中心上,可以自由进行各个角度的旋转。但是,模型平移一个距离后,再次旋转时,发现旋转中心不在模型的中心了,导致旋转非常别扭。rn问题现象对应的绘图代码如下:rnglMatrixMode(GL_MODELVIEW);rnglLoadIdentity();// Reset the coordinate system before modify
VertexGLDemo
利用OpenGL 渲染一个三角形,绕着Z轴旋转。
Android6.0 WMS(七) 窗口Z轴位置
通过前面几篇文章的学习,我们知道了在Android系统中,无论是普通的Activity窗口,还是特殊的输入法窗口和壁纸窗口,它们都是被WindowManagerService服务组织在一个窗口堆栈中的,其中,Z轴位置较大的窗口排列在Z轴位置较小的窗口的上面。有了这个窗口堆栈之后,WindowManagerService服务就可以按照一定的规则计算每一个窗口的Z轴位置了,这个在之前的http
opengl中平移、旋转、缩放
在opengl中对图形进行变换,rn将要变换的部分在rnglPushMatrix();和glPopMatrix();之间实现,其改变的部分,在之外实现。rnrn其中,rnglTranslatef(x,y,z);//对坐标平移rnglScaled(x,y,z);//对坐标放大rnglRotatef(seta,(x,y,z);//对坐标旋转
加速度传感器中任意静止时刻任意角度下x,y,z方向上的加速度算法
以下是自己查看网上资料写的算法,但是实际测试发现,我希望的是静止状态下得到的实际加速度应该为零,但是按照重力加速度向x,y,z分量的角度写的当下的算法是不等于0的,和实际要求不符合;请求好心人指点以下:rnrnrnpublic void onSensorChanged(SensorEvent evt) {rn// TODO Auto-generated method stubrnif (evt.s
在unity中对物体进行放大缩小,绕X,Y,Z轴进行旋转,左右上下平移,显示隐藏
以下代码实现对物体的一些列操作:using UnityEngine;public class sanweixuanzhuandx : MonoBehaviour{       private float positionX;    private float positionY;    private float positionZ;    private float scalePosiontX ...
元素的移动(translate)
                               元素的移动(translate) nntranslate()函数可以将元素向指定的方向移动,就像position中的relative.nn nntranslate()分为三种情况:nn nntranslate(x,y)水平方向和竖直方向同时移动(也就是X轴方向与Y轴方向同时移动)n nntranslate(x)仅水平方向移动n nntr...
C#获取感JY901M_485姿态传器的X Y Z角度
1.JY901M_485姿态传器的控制和数据协议说明1.1 读取指令和数据回传格式1.2 xyz轴角度所在寄存器地址2 拼接获取xyz轴角度指令0x50 0x03 0x00 0x3d 0x00 0x3e 0x00 0x3f 0x00 0x33 0x00 0x003 编写代码3.1 查看串口win10环境直接在左下输入设备管理进入设备管理器查看设备所在串口3.2 建立 wpf 项目——modbus ...
Unity绕x轴旋转并限制角度的陷阱
n在制作FPS相机时,遇到了需要限制角度的需求,视角只能查看到-60到60度的范围,而在Unity的Transform组件中,绕x轴逆时针旋转,Transform组件的localEulerAngle会在0~360范围内递增(如图)n关键在于其中的角度转换,直接上代码n public static void RotateClampX(this Transform t, float de...
旋转矩阵表示姿态XYZ坐标轴关系
姿态的坐标轴XYZ在空间坐标系下的表示 rn
rotate()旋转角度/顺逆时针问题
理论上都应是让各轴的正向(X轴向右、Y轴向下、Z轴面向自己)指向自己,顺时针(正角度值)/逆时针(负角度值)转;nn但rotate()、rotateZ(),会采用就近转到目标角度原则:nn 小于180°,正常顺时针,但大于180°就要注意:例设值200deg,会逆时针转160度完事;n  设180°会逆时针转,-180°才顺时针;n  设360°的倍数值压根转都不转。n而rotateX() 、 r...
【Unity】摄像机锁定z轴
第三人称视角锁定z轴,避免出现视角倾斜。
Android X轴Y轴Z轴旋转
Android中并没有提供直接做3D翻转的动画,所以关于3D翻转的动画效果需要我们自己实现,一个简单的办法就是重写Animation。先看下效果图 n具体实现代码:public class MyAnimation extends Animation {n int centerX, centerY;n Camera camera = new Camera(); @Override
2张图片叠放,根据鼠标的移动来显示
Insert title herernrnrnrnsrc="图片路径" >rnrnstyle="position:absolute; z-index:1;" rnsrc="图片路径" />rnrnrnrnfunction ShowDes(id) {rndocument.getElementById('img'+id).style.display="none";rn}rnfunction Clear
Unity 2D学习笔记 - 关于镜头z轴位置的问题
问题n某一次当我对镜头Reset之后n n物体还在镜头里面,而画面却变成了一片空白nnn解决n镜头位置改成任意小于-0.3的负数nn原因在于,模型素材的z轴位置一般都是设为0,这时镜头z轴也取0的话,就重叠在一起了n切换成3D视图可以更容易理解nn所以我们把镜头z轴负方向往后拉一下就好了,因为是2D,所以拉远拉近也没有什么差别nn但为什么是“-0.3”?n在3D视图仔细留意会发现,镜头实际拍摄的位...
三维图形绕任意轴旋转矩阵求解步骤
在3D游戏中操作矩阵最为常见,其中最重要的莫过于平移旋转矩阵,在这里总结了一下三维矩阵绕任意轴的矩阵步骤。此外,由于单个绕x、y、z轴旋转,在这里就不罗列了rn步骤如这张图显示:
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java学习opengl opengl教程python