• <menu id="w2i4a"></menu>
  • logo VectorDraw Developer Framework使用教程

    文檔首頁(yè)>>VectorDraw Developer Framework使用教程>>VDF常見(jiàn)問(wèn)題整理(十五):如何在3D視圖中檢查對(duì)象是否隱藏在另一個(gè)對(duì)象中?

    VDF常見(jiàn)問(wèn)題整理(十五):如何在3D視圖中檢查對(duì)象是否隱藏在另一個(gè)對(duì)象中?


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

    VectorDraw Developer Framework試用版下載


    問(wèn):

        如何在3D視圖中檢查對(duì)象是否隱藏在另一個(gè)對(duì)象中?例如,我有兩個(gè)多面體,一個(gè)是z = 100的大面積,另一個(gè)是z = 0的面,并且視圖是只有一個(gè)多面體是可見(jiàn)的,另一個(gè)多面體是在大面體后面,并且是完全看不見(jiàn)的在屏幕上。

    答:

        你需要一些OpenGL代碼來(lái)檢查一個(gè)對(duì)象是否落后于另一個(gè)對(duì)象(不可見(jiàn))。

        您需要的代碼如下:

      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;
                    }
                }
     
            }

    相關(guān)資料推薦:

    VectorDraw Developer Framework(VDF)示例


        如果您對(duì)想要購(gòu)買(mǎi)正版授權(quán)VectorDraw Developer Framework(VDF),可以聯(lián)系在線(xiàn)客服>>咨詢(xún)相關(guān)問(wèn)題。

        關(guān)注慧聚IT微信公眾號(hào) ???,了解產(chǎn)品的最新動(dòng)態(tài)及最新資訊。

    1561953111.jpg

    850×100.png

    掃碼咨詢(xún)


    添加微信 立即咨詢(xún)

    電話(huà)咨詢(xún)

    客服熱線(xiàn)
    023-68661681

    TOP
    三级成人熟女影院,欧美午夜成人精品视频,亚洲国产成人乱色在线观看,色中色成人论坛 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();