VectorDraw常見問題整理:如何在3D視圖中檢查對象是否隱藏在另一個對象中?

   VectorDraw Developer Framework(VDF)是一個用於應用程序可視化的圖形引擎庫。有了VDF提供的功能,您可以輕鬆地創建、編輯、管理、輸出、輸入和打印2D和3D圖形文件。   


問:

    如何在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 ? "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;
                }
            }
 
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章