VDF常见问题整理(十五):如何在3D视图中检查对象是否隐藏在另一个对象中?

本系列教程整理了VectorDraw Developer Framework(VDF)最常见问题,教程整理的很齐全,非常适合新手学习,本节教程将会介绍如何在3D视图中检查对象是否隐藏在另一个对象中。

VectorDraw Developer Framework试用版下载


问:

    如何在3D视图中检查对象是否隐藏在另一个对象中如,我有两个多面体,一个是z = 100的大面积,另一个是z = 0的面,并且视图是只有一个多面体是可见的,另一个多面体是在大面体后面,并且是完全看不见的在屏幕上。

答:

    你需要一些OpenGL代码来检查一个对象是否落后于另一个对象(不可见)。

    您需要的代码如下:

  vdPolyface purple;  // this is the polyface to check if is behind  the green polyface                void test()        { // just create the objects            vdPolyface pf1 = new vdPolyface(doc);             pf1.CreateBox(new gPoint(0, 0), 1, 1, 1, 0);            pf1.PenColor = new vdColor(Color.Purple);            doc.Model.Entities.AddItem(pf1);            purple = pf1; // this is the polyface to check if is behind the green polyface             vdPolyface pf2 = new vdPolyface(doc);            pf2.CreateBox(new gPoint(-2, 2), 4, 4, 4, 0);            pf2.PenColor = new vdColor(Color.Green);            doc.Model.Entities.AddItem(pf2); // this is the green polyface that hides the purple one                       doc.RenderMode = vdRender.Mode.Shade;            //doc.CommandAction.View3D("VINW");            doc.CommandAction.View3D("VINE");                                }        bool IsObjectVisible = false;        void test1() // this is the method that checks the “visibility” using the OnDrawAfter event        {            IsObjectVisible = false;            doc.OnDrawAfter += new vdDocument.DrawAfterEventHandler(TestObjectVisibility_OnDrawAfter);            doc.RenderMode = vdRender.Mode.Shade;            doc.Redraw(true);            doc.OnDrawAfter -= new vdDocument.DrawAfterEventHandler(TestObjectVisibility_OnDrawAfter);            MessageBox.Show(IsObjectVisible nbsp;"Object is visible" : "Object is not visible");        }         void TestObjectVisibility_OnDrawAfter(object sender, vdRender render)        {            double[] _modelMatrix = new double[16], _projMatrix = new double[16];            int[] _viewport = new int[4];            double pwinx = 0.0, pwiny = 0.0, pwinz = 0.0;            //GET the active world to view and view to pixel matrixes            VectorDraw.Render.OpenGL.OpenGLImports.glGetDoublev(VectorDraw.Render.OpenGL.OpenGLImports.Parameters.GL_PROJECTION_MATRIX, _projMatrix);            VectorDraw.Render.OpenGL.OpenGLImports.glGetDoublev(VectorDraw.Render.OpenGL.OpenGLImports.Parameters.GL_MODELVIEW_MATRIX, _modelMatrix);            VectorDraw.Render.OpenGL.OpenGLImports.glGetIntegerv(VectorDraw.Render.OpenGL.OpenGLImports.Parameters.GL_VIEWPORT, _viewport);             Rectangle winrc = new Rectangle(_viewport[0], _viewport[1], _viewport[2], _viewport[3]);            foreach (gPoint pt in purple.VertexList)            {                 VectorDraw.Render.OpenGL.OpenGLImports.gluProject(pt.x, pt.y, pt.z, _modelMatrix, _projMatrix, _viewport, ref pwinx, ref pwiny, ref pwinz);                Point winPt = new Point((int)pwinx, (int)pwiny);                if (!winrc.Contains(winPt)) continue;                //Get the existing depth in previous calculated pixel                 double depth = VectorDraw.Render.OpenGL.OpenGLImports.glReadPixelDepth((int)(pwinx), (int)(pwiny));                //the pt is visible if the pwinz is smaller than the existing(it is closest to eye)                double def = pwinz - depth;                if (def <= 0.000001)                {                    IsObjectVisible = true;                    break;                }            }         }

相关资料推荐:

VectorDraw Developer Framework(VDF)示例


    如果您对想要购买正版授权VectorDraw Developer Framework(VDF),可以联系在线客服>>咨询相关问题。

850×100.png

标签:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年8月13日
下一篇 2019年8月13日

相关推荐

发表回复

登录后才能评论