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金币,希望有人能解决。只要提供解决的方法,或者给予启示,或者提供线索都可以获得悬赏。

5个回答

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

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

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

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

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

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

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Z轴
有两个独立的窗口a,b,a通过SetWindowPos设置为Z序最顶层,我想让b保持在Z序的第二层,即一直在 rna的下面,在其它所有窗口的上面。 rn这是可以实现的吗?
z轴显示次序问题
拖动滚动条向下时,table第一行下边沿的蓝线就会消失,如何让其不消失rnrnrnrnrnrn Untitled Documentrn rn rnrnrnrn rn rn rn rn rn 名 称 rn 定编数量rn 实际数量 rn 比较(±)rn rn rn rn rn rn rn 合计rn 4rn 60rn 11rn rn rn rn 交通装备rn 4rn 15rn 11rn rn rn rn 陆地交通装备rn rn 15rn rn rn rn rn 汽车rn rn 15rn rn rn rn rn 轿车rn rn 13rn rn rn rn rn 旅行车rn rn rn rn rn rn rn 大货车rn rn 2rn rn rn rn rn 小货车rn rn rn rn rn rn rn 摩托车rn rn rn rn rn rn rn 两轮摩托车rn rn rn rn rn rn rn 三轮摩托车rn rn rn rn rn rn
对话框Z轴顺序问题
在设计一个对话框的时候,经常会涉及到一个Control被另一个Control覆盖的情形,虽然设置Tab Order可以改变Z轴顺序,但是执行时的Z轴顺序竟然与设计时是相反的!rn所见即所得,本是一种快速好用的设计方法,为什么微软在VC的对话框中不这样呢?rn是否有便捷的方法在涉及对话框的时候就可以方便地排布Z轴顺序?
CWnd 子窗口z轴问题
rn我有一窗口,以它为父窗口,创建了一些WS_CHILD属性的子窗口(派生于CWnd)rnrn当父窗口上显示着一个子窗口A,再显示另外一个子窗口B时,这个后来的子窗口B总是得不到鼠标的焦点rnrnrn我希望这个子窗口B能像一个浮动窗口一样,在最上层浮动,随时打开,或者隐藏到父窗口的一侧,rn而不用管他的下层显示的是哪个子窗口rnrn请问一下这种情况该怎么设置窗口的属性呢?rnrn
窗口Z轴层次的问题
怎样实现FORM1总在FORM2上方?rn注意不要把FORM1放在最顶层,而是只要在FORM2上方就可以了(还要能够拖到屏幕所有地方,所以SETPARENT不行)rn再注意不要让FORM1不能激活!rn其实形象的说就是PHOTOSHOP工具栏的效果
判断目标是否在Z轴方向的X轴水平面的上方 方向判断
1.在自身的前后: Vector3.Dot(transform.forward,target.position-transform.position) 返回值为正时,目标在自己的前方,反之在后方 2.在自身的左右: Vector3.Dot(transform.right,target.position-transform.position) 返回...
OpenGL的问题: glRotatef(spin, 0.0, 0.0, 1.0); 是绕z轴转动,怎么变成绕与z轴平行的轴转动?
我想让图形绕 一个轴转动,这个轴平行于z轴,但轴的位置在x=100,z=100处rnrn这个如何实现?rnrn非常感谢
●什么是z轴?●
书上说:GetNextWindow 会得到z轴下一个窗口的句柄,rn那么,什么是z轴?rnrn
控件的Z轴高度
本课程讲解的是如何在Android中使用Material Design以及Palette实现原理,源码分析和将他移植到iOS和Python平台。
规则 - z轴拆分
内容:经常根据客户的独特属性进行拆分 场景:非常大而且类似的数据集,如庞大而增长快速的客户群,或者当响应时间对在地理上广泛分布的客户变得很重要的时候。 用法:根据所知道的客户属性对数据和服务进行拆分 原因:客户的快速增长超过了其他形式的数据增长,或者在扩展时,需要在某些客户群之间进行必要的故障隔离。 要点:z轴拆分对扩大客户基数的效果明显,也用在其他那些无法用y轴拆分的大型数据集上。  ...
Android Z轴布局
如果需要在布局中创造一个层叠的概念,那么使用Android系统中的ViewGroup是不够的,但是可以通过改变ViewGroup的绘制顺序实现 继承自FrameLayoutFrameLayout已经帮我们实现了子View的measure和layout过程,我们只需在它的基础上改变绘制顺序即可自定义LayoutParamslayoutParams的作用是向父布局请求布局参数(MeasureSpec),
MFC--窗口Z轴
项目中遇到一个这样的情况:主窗口包含一个子窗口 WallDlg(深蓝色区域),WallDlg中包含若干SurfaceWnd(途中黑块)。要求在Surface中按回车键后,该Surface变为全屏,再按回车后返回。(WallDlg 是主窗口的子窗口,SurfacWnd 们是WallDlg的子窗口) 通过淫她奶他搜到的“”主流”方法如下: void CSurface::ZoomOut()
Picture1,y轴的方向问题
[code=VB]rnPrivate Sub Command2_Click() rnDim i As Integer, it As Integer, s As Integer, m As Integer, d As Integer, ii As Integer, g As Integer rnPicture1.AutoRedraw = True rnPicture1.Scale (0, 0)-(100, 30) rnrnFor it = 1 To MSFlexGrid1.Rows - 3 rns = MSFlexGrid1.TextMatrix(it, 5) rnrnm = MSFlexGrid1.TextMatrix(it + 1, 5) rng = MSFlexGrid1.TextMatrix(it + 2, 5) rnPicture1.Line (it, Val(s))-(it + 1, Val(m)) rnrnPicture1.Print Val(g) rnNext rnrnEnd Sub rn[/code]rnrn现在y轴的0在Picture1的左上方,数据越大,他越向下,看起来很费劲,如何改成y轴的0在Picture1的左下方,然后数据越大越向上呢,这样符合观看的规律rn
控件z方向的顺序
有提到Canvas支持zindexrnrn但我的布局里面没用Canvas,而且感觉Canvas这个布局好像也不太好用。rnrn布局里面全是grid stackpanel这样的 控件z方向的顺序怎么动态指定呢?rnrn多谢指点。
一个高难度的问题(控件的Z轴问题)
我在网页上放了几个控件其中有一个DataGrid、TextBox、Calendar、DropDownListrn、Button,我想单击Button让Calendar.Visible =true;在通过rnTextBox.Text =Calendar1.SelectedDate.ToShortDateString ();rnCalendar.Visible =false;将日期返给TextBox,但是在Calendar.Visible =true;时出现了问题:问题是在要显示Calendar的地方我放有DropDownList、DataGrid控件rn在我用Calendar.Visible =true;显示Calendar时DropDownList、DataGrid控件挡住了Calendar控件,也就是说Calendar只有在DropDownList、DataGrid外边的部分才显示了出来,怎样才能让Calendar显示在顶层,让DropDownList、DataGrid显示在它的下面呢。rn请高手指点rn谢谢
请教各位OpenInventor,OpenGL大神,如何进行沿x,y,z三轴方向进行观察
如何在SoWinExaminerViewer中对物体进行分别沿x,y,z三轴方向进行观察?是对camera进行设置吗?
Android X轴Y轴Z轴旋转
Android中并没有提供直接做3D翻转的动画,所以关于3D翻转的动画效果需要我们自己实现,一个简单的办法就是重写Animation。先看下效果图 具体实现代码:public class MyAnimation extends Animation { int centerX, centerY; Camera camera = new Camera(); @Override
【Unity】摄像机锁定z轴
第三人称视角锁定z轴,避免出现视角倾斜。
z轴不兼容ie6 ie7
写了两个div,dw提示这样的错误:rnrn定位的容器会定义新的堆叠顺序,即使容器计算所得的 z 轴值为自动也不例外。这会导致容器的已定位子项在不适当的场合出现rnrn在页面的其它已定位元素之上。rnrn这是什么问题rnrn请问怎么解决rnrn谢谢
取得控件的Z轴次序
就是控件在上面还是下面的.rnrnsetwindowpos中的第一个参数pWndInsertAfter rnrn可以设置 但如何取得呢?rn
picturebox 有Z轴吗
我想在程序规定某个picturebox 覆盖另一个picturebox,WPF中的IMAGE是有Z轴的,不知道PICTUREBOX是怎么样的
Cocos2dx学习笔记(4)——Z轴
新博客地址:http://fantasticmiao.cn/ X、Y、Z轴     虽然我们看到的游戏画面是平面的,但是事实上游戏里仍然有Z轴的概念。举个简单的例子,当两个精灵的位置重合时,总会有一个在上一个在下,在上的会把下面的遮盖住,那么这个就是Z轴的概念。     如上图所示,层2的内容会把层1的内容遮住。当然,如果两个对象的大小不一样,遮挡自然也可能不全面,所表达出来的游戏画面
堆叠控件(Z轴顺序)!!!
请问控件的SendToBack()方法和BringToFront()方法的具体是怎么工作的,比如他们是怎么改变控件的z轴顺序的。谢谢。
Z轴上移动函数??
窗口按Z轴上移动,rn和按Z轴下移动是那些函数啊??
su 沿z轴变色
sketchup软件插件可以使图形沿z轴变色,高程分析利器
窗口 Z 轴位置的问题??(SetWindowPos?NO!)
我们都知道软件中的”查找“窗口吧,它会在”当前应用程序“之上,但是它不会在所有的窗口之上,这是如何做到的呢??再比如,windows资源管理器中的文件复制进度对话框,它会在当前的资源管理器窗口上,但是另外一个资源管理器窗口却可以在它们之上。rnrn求教?我用如下方法:rn ::SetWindowPos(this->m_pOF->HWndParent, this->GetSafeHwnd(), NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);rnrn this->m_pOF->HWndParent 是在下边的窗口句柄。rn this 是个对话框,它要在 HWndParent 窗口之上。rnrn我该如何做到呢?感谢!!
关于java界面的Z轴问题
在JAVA的界面里是不是也有Z轴的概念rn那个大侠能给小弟讲讲rn或者给个文章链接
ReporetView打印问题,默认纸张,默认方向
我需要打印一张单据,大小为21cm*12cm,当我用reportviewer打印时,预览正确,但是打印时,都变成横向的,默认纸张也变成letter了,有什么办法解决么
OpenGL方向型光源问题
我这样设置方向型光源:rn private float light_position[] = 0.5f ,0.0f ,5.0f ,0.0f;rn private float light_ambient[] = 0.6f ,0.6f ,0.6f ,1.0f;rn private float light_deffuse[] = 0.5f ,0.5f ,1.0f ,1.0f;rn private float light_specular[] = 1.0f ,1.0f ,1.0f ,1.0f;rnrn gl.glEnable(GL.GL_DEPTH);rn gl.glEnable(GL.GL_LIGHTING);rn gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, light_position,0);rn gl.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, light_ambient, 0);rn gl.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, light_deffuse, 0);rn gl.glLightfv(GL.GL_LIGHT0, GL.GL_SPECULAR, light_specular, 0);rn gl.glEnable(GL.GL_LIGHT0);rnrn当我把物体从原点不停地向一个方向移动的时候,影子就越来越少,最后整个物体都变成一片同样的颜色,根本没有影子rn在方向型光源照射下,在任何地方影子都是一样的才对啊,我这个怎么还会变化的?rn
观察坐标系中摄像机Z轴位置和定义的顶点Z轴位置搞不懂,菜鸟问题。
观察坐标系中摄像机Z轴位置和定义的顶点Z轴位置搞不懂,怎么感觉和左手坐标系矛盾啊。rnrn观察坐标系中摄像机Z轴位置和定义的顶点Z轴位置搞不懂,怎么感觉和左手坐标系矛盾啊。rn我的程序:rnD3DXMatrixPerspectiveFovLH(&toushi, 45.0f, 640/480,0.1f, 10000.0f);//这样设置看的应该够远的了rn...rnD3DXVECTOR3 vEyePoint(0.0f,0.0f,301.0f);//摄像机的位置Z轴暂时定在301rn...rnrn-150.0f, -150.0f, 300.0f, D3DCOLOR_XRGB(255,255,0),//顶点数据的Z轴都是300rn150.0f, -150.0f, 300.0f, D3DCOLOR_XRGB(255,0,0),rn0.0f, 150.0f, 300.0f, D3DCOLOR_XRGB(0,0,255)rnrn按照左手坐标系Z轴正方向朝屏幕里,但是这里我无法理解的是:当摄像机位置Z轴大于300.0f时才可以看到三角形,无法理解,如果大于三角形顶点Z的300.0f坐标,那这个摄像机不是跑到顶点的后面去了即屏幕的更里面,并且摄像机朝着Z方向,那这个摄像机是怎么拍下三角形定点的啊。按我的理解摄像机应该是要在定点前面就是摄像机Z轴应该小于定点Z的300.0f,但是现在是只要比300小就完全看不到三角形。我哪里理解错了,救命提点一下啊大侠。rnrn
三轴加速度传感器方向区分问题
随便把三轴加速度传感器置于车辆内(三轴的方向与车辆行驶方向、上下方向可能不一致),怎么区分传感器的XY轴对应车辆的前进方向还是左右方向?rn z轴我已经会区分 直接取静止下加速度接近9.8的就代表车辆的上下方向了rn rn 但想下面这个图 原来(z-车辆上下 y-车辆前进 x-车辆左右),现在我把它转90度 变成(y-车辆左右 x-车辆前进),在我读传感器数据的时候怎么区分这两个轴?最好在车辆静止状态下就能区分。rnrn[img=https://img-bbs.csdn.net/upload/201803/01/1519891310_355797.png][/img]
柱面一定平行轴(x轴或y或z)?柱面一定平行轴(x轴或y或z)?
柱面一定平行轴(x轴或y或z)?
OpenGL旋转摄像机方向
OpenGL+VS2015,在3D的空间内可以向各个方向移动摄像机的角度,通过wasd控制
opengl就业方向
本人正在学习openGL,请大家谈谈它的就业方向啊!学这个以后的工资怎么样啊?
Camera.translate(x,y,z)中的Z轴拉伸计算
现在希望使用下列代码实现图片在Z轴上的拉伸rnrnfloat zz;rnCamera cam = new Camera();rncam.save();rncam.translate(0.0f, 0.0f, zz);rnrn已知在Z轴拉伸之后 图片的width和height都放大了 zoom倍rn求zz的值rnrn需要给出程序或者算法
OpenGL深度测试带来的问题----Z冲突
考虑这样一种情况,你需要在泳圈模型上贴一个叮当猫的图像,让泳圈模型显得更好看,那么叮当猫贴图和泳圈模型的深度值z值几乎完全相同,这样就使泳圈模型看起来一团糟
请教高手(关于HTML中层与层之间Z轴方向显示的问题)
我在程序中用到一个下拉式菜单,我把这项菜单做成一个层 ,并放在最顶层,但这个菜单无法覆盖底层的列表框元素,影响了菜单的显示效果,rn请问高手有何解决办法?
OpenGL 立方体绕任意轴旋转问题
假设立方体8个顶点为v1,v2,v3,v4, v5, v6, v7, v8,我的目标是让立方体绕着v1和v2组成的连线旋转。rnrn我的思路是可以先让x轴或y轴与v1,v2连线重合,再绕x轴或y轴旋转,最后再移回去。rn但是由于旋转后再移动就是依据新的坐标系移动,没法再移回去了。rnrn例如:如下两种变换结果就是不一样的rn//无法移回到原来的位置rngl.glTranslatef(0.0f, 1.0f, 0.0f);rngl.glRotatef(45, 1.0f, 0.0f, 0.0f);rngl.glTranslatef(0.0f, -1.0f, 0.0f);rngl.glRotatef(-45, 1.0f, 0.0f, 0.0f);rnrn//可以移回到原来的位置rngl.glTranslatef(0.0f, 1.0f, 0.0f);rngl.glRotatef(45, 1.0f, 0.0f, 0.0f);rngl.glRotatef(-45, 1.0f, 0.0f, 0.0f);rngl.glTranslatef(0.0f, -1.0f, 0.0f);
MFC 判断控件Z 轴序列
怎么判断控件是否在最上面?谢谢!
Android6.0 WMS(七) 窗口Z轴位置
通过前面几篇文章的学习,我们知道了在Android系统中,无论是普通的Activity窗口,还是特殊的输入法窗口和壁纸窗口,它们都是被WindowManagerService服务组织在一个窗口堆栈中的,其中,Z轴位置较大的窗口排列在Z轴位置较小的窗口的上面。有了这个窗口堆栈之后,WindowManagerService服务就可以按照一定的规则计算每一个窗口的Z轴位置了,这个在之前的http
相关热词 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池 c#5.0 安装程序 c# 分页算法