2010-12-13 16 views
5

मेरे पास 3 डी ऑब्जेक्ट्स के साथ एक एप्लिकेशन है जो व्यूपोर्ट 3 डी में रहता है और मैं चाहता हूं कि उपयोगकर्ता स्क्रीन पर आयताकार खींचकर उन्हें चुनने में सक्षम हो।wpf3d आयताकार हिट टेस्ट

मैंने परिणाम प्राप्त करने के लिए व्यूपोर्ट 3 डी पर ज्यामिति हिटटेस्ट पैरामीटर (आयताकार ज्यामिति के साथ) को लागू करने का प्रयास किया, लेकिन मुझे एक अपवाद मिलता है कि यह व्यूपोर्ट 3 डी के साथ असमर्थ है। केवल PointHitTestParameters समर्थित हैं।

क्या कोई इसे करने के लिए किसी भी सुरुचिपूर्ण तरीके से जानता है, इसे स्वयं की गणना करने के अलावा (उदाहरण के लिए - सभी 3 डी ऑब्जेक्ट्स को 2 डी तक प्रोजेक्ट करना और आयताकार के साथ मैन्युअल ज्यामिति चौराहे करना)?

+0

आप इस लिंक से दृष्टिकोण की कोशिश की? http://blogs.msdn.com/b/wpf3d/archive/2009/05/18/3d-hit-testing.aspx –

+0

बेशक। यह पॉइंट/रे हिट-टेस्टिंग के लिए ज्ञात दृष्टिकोण है। मैं आयताकार हिट-टेस्टिंग की तलाश में हूं। यह ढांचे का एक एकीकृत हिस्सा नहीं है, लेकिन शायद कोई जानता है कि मैं अपने काम को सुन्दर तरीके से प्राप्त करने के लिए ढांचे का उपयोग कैसे कर सकता हूं। वैसे भी, GeometryHitTestParameters Viewport3D पर काम नहीं करता है। इसलिए मैं इसे अपने आयताकार हिट-परीक्षण के लिए उपयोग नहीं कर सकता। – Alex

उत्तर

0

मुझे शक है वहाँ चयनित आयत बिंदुओं के माध्यम से पुनरावृत्ति की तुलना में बेहतर तरीका है:

private void view_PreviewMouseDown(object sender, MouseButtonEventArgs e) { 
     const double offset = 3.0; // I will test in a square 7x7 
     var mouse = e.GetPosition(this); 
     var items = new HashSet<Model3D>(); 
     for (double x = mouse.X - offset; x <= mouse.X + offset; x++) 
      for (double y = mouse.Y - offset; y <= mouse.Y + offset; y++) { 
       PointHitTestParameters pointparams = new PointHitTestParameters(new Point(x, y)); 
       Model3D result = null; 
       VisualTreeHelper.HitTest(view, null, rawresult => { 
        var rayResult = rawresult as RayMeshGeometry3DHitTestResult; 
        if (rayResult != null) 
         items.Add(rayResult.ModelHit); 
        return HitTestResultBehavior.Continue; 
       }, pointparams); 
      } 
     // temporary ListBox to show items 
     list.ItemsSource = items.Select(item => item as GeometryModel3D == null ? null : (item as GeometryModel3D).Material as object); 
    } 

देखें MSDN How to: Hit Test in a Viewport3D

+1

बेशक वहाँ है। उदाहरण के लिए, मैन्युअल रूप से कैमरे के पैरामीटर का उपयोग करके देखने के निराशा की गणना करना, और फिर मैन्युअल रूप से दृश्य पेड़ को पार करना और मॉडल-विरोधी-फ्रस्टम रोकथाम परीक्षण करना। बाध्यकारी बक्से का उपयोग करके उच्च गति प्राप्त की जा सकती है। लेकिन यह पहिया को फिर से शुरू कर रहा है। वे पहले से ही डब्ल्यूपीएफ के अंदर रे-आधारित हिट परीक्षण के साथ कर रहे हैं। केवल अंतर यह है कि चौराहे का परीक्षण रे-मॉडल है और फ्रस्टम-मॉडल नहीं है। मैं वेब पर इस परिदृश्य के लिए एक कामकाजी कोड नहीं ढूंढ पाया और मैंने सोचा कि कोई यहां जानता है कि मुझे नौकरी करने वाले कुशल कोड कहां मिल सकते हैं। – Alex

संबंधित मुद्दे