VectorDrawよくある質問は仕上げ:オブジェクトが3Dビュー内の別のオブジェクトに隠されているかどうかを確認する方法?

   VectorDraw開発フレームワーク(VDF)は、グラフィックスエンジンライブラリの可視化のためのアプリケーションです。VDFを使用すると、簡単に作成、編集、管理することが可能な機能、エクスポート、インポートおよび印刷2Dおよび3Dグラフィックスのファイルを提供しています。   


Q:

    どのように3Dビュー内のオブジェクトをチェックするために別のオブジェクトに隠されていますか?例えば、私は2つの多面体を有する、大面積が= 100、Zであり、他方の面はz = 0であり、そしてビューのみ多面体が可視であり、他方は多面体オモ体の背後にあり、且つ完全に見えません画面上に。

回答:

    あなたは他のオブジェクト(見えない)の背後にあるオブジェクトかどうかを確認するためにいくつかのOpenGLのコードを必要としています。

    次のように必要なコードは次のとおりです。

  紫vdPolyface; //これは、緑のポリフェイスの背後にあるかどうかを確認するためにポリフェイスです
        
        空テスト()
        {//オブジェクトのみを作成
            vdPolyface PF1 =新しいvdPolyface(DOC); 
            pf1.CreateBox(新しいgPoint(0、0)、1、1、1、0);
            pf1.PenColor =新しいvdColor(Color.Purple)。
            doc.Model.Entities.AddItem(PF1)。
            紫=のPF1。//これは、緑のポリフェイスの背後にあるかどうかを確認するためにポリフェイスです
 
            vdPolyface PF2 =新しいvdPolyface(DOC);
            pf2.CreateBox(新しいgPoint(-2、2)、4、4、4、0);
            pf2.PenColor =新しいvdColor(Color.Green)。
            doc.Model.Entities.AddItem(PF2)。//これは紫色のものを隠すの緑ポリフェイスです
          
 
            doc.RenderMode = vdRender.Mode.Shade。
            //doc.CommandAction.View3D("VINW ");
            doc.CommandAction.View3D( "VINE")。
            
            
        }
        IsObjectVisible = falseのブール値。
        空TEST1()//これはOnDrawAfterイベントを使用して「可視性」をチェックする方法であり、
        {
            IsObjectVisible = falseは、
            doc.OnDrawAfter + =新しいvdDocument.DrawAfterEventHandler(TestObjectVisibility_OnDrawAfter)。
            doc.RenderMode = vdRender.Mode.Shade。
            doc.Redraw(真の);
            doc.OnDrawAfter  -  =新しいvdDocument.DrawAfterEventHandler(TestObjectVisibility_OnDrawAfter)。
            MessageBox.Show(?IsObjectVisible「オブジェクトが表示され、」:「オブジェクトが表示されていません」)。
        }
 
        無効TestObjectVisibility_OnDrawAfter(オブジェクト送信者、vdRenderはレンダリング)
        {
            ダブル[16] [] _modelMatrix =新しい二重、_projMatrix [16] =新しいダブル。
            INT [] _viewport =新しいINT [4]。
            二重pwinx = 0.0、pwiny = 0.0、pwinz = 0.0。
            //アクティブな世界が見ると、画素マトリクスに表示するには、Get
            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)。
 
            矩形winrc =新しいRectangle(_viewport [0]、_viewport [1]、_viewport [2]、_viewport [3])。
            foreachの(purple.VertexListでgPointのPT)
            {
 
                VectorDraw.Render.OpenGL.OpenGLImports.gluProject(pt.x、pt.y、pt.z、_modelMatrix、_projMatrix、_viewport、REF pwinx、REF pwiny、REF pwinz)。
                ポイントwinPt =新しいポイント((int型)pwinx、(int型)pwiny)。
                (もし!winrc.Contains(winPt))続けます。
                //前回算出された画素内の既存の深さを取得します。 
                二重深さ= VectorDraw.Render.OpenGL.OpenGLImports.glReadPixelDepth((INT)(pwinx)、(INT)(pwiny))。
                pwinzは、既存の(それは眼に最も近い)よりも小さい場合// PTが表示されています
                ダブルDEF = pwinz  - 深さ。
                IF(DEF <= 0.000001)
                {
                    IsObjectVisible =はtrue。
                    ブレーク;
                }
            }
 
        }

おすすめ

転載: blog.51cto.com/14477114/2444833