2012-05-14 19 views
6

तो यह है। मेरे पास एक निश्चित प्वाइंट 3 डी है। मेरे पास एक कैमरा है। मुझे कैमरे के दृश्य कोण पता है, जो 45 डिग्री है; मुझे कैमरा स्थिति और लुकडाइक्शन वेक्टर पता है। अब मैं यह पता लगाने का कोई तरीका चाहता हूं कि बिंदु कैमरे के लिए दृश्यमान होगा या नहीं।यह पता लगाने के लिए कि क्या कोई निश्चित पॉइंट 3 डी कैमरा दृश्य सीमाओं के अंदर है?

So p1 Should be visible, p2 should not उन लोगों के लिए धन्यवाद जो जवाब दिया है और टिप्पणी की है, लेकिन:

  1. यह मेरे लिए एक सीधा समस्या नहीं है। यह एक साधारण बात प्रतीत हो सकती है, लेकिन मुझे समस्या को हल करने के लिए कोई विशेष विधि या सहायक वर्ग नहीं मिला। मैं इसे अपने आप को सुलझाने, एक विशुद्ध रूप से गणित तरह से कोशिश की है, लेकिन समाधान अस्थिर है और अप्रत्याशित काम करता है:

    bool isPointInCameraView(Point3D P, Point3D CP, Vector3D LD, double CameraAngle) { 
        //first calculate Distance to the plane formed by normal vector LD and point P on it 
        var D = -LD.X*P.X-LD.Y*P.Y-LD.Z*P.Z; // -AXb-BYb-CZb 
        //L is the distance to the plane. 
        double L = Math.Abs((LD.X * CP.X + LD.Y * CP.Y + LD.Z * CP.Z + D))/Math.Sqrt(LD.X * LD.X +    LD.Y * LD.Y+LD.Z * LD.Z);    
        var BL = L * Math.Tan(CameraAngle); //length of bound part 
        var PL = Math.Sqrt(((new Vector3D(P.X - CP.X, P.Y - CP.Y, P.Z - CP.Z)).LengthSquared - L * L)); // length of point part 
        //test if point is out of bounds! 
        return PL <= BL; 
    } 
    
  2. मैं Helix3D बारे में पता है और मैं इसे का उपयोग कर रहा हूँ। मेरा व्यूपोर्ट और कैमरा हेलिक्स ढांचे से हैं।

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

+0

यह शायद http://math.stackexchange.com/ –

+0

पर अधिक प्रासंगिक है आपने पहले से क्या प्रयास किया है? यह एक बहुत सीधी समस्या है, यह देखना अच्छा लगेगा कि आप कुछ प्रयास करेंगे ... –

उत्तर

1

अच्छी तस्वीर!

मुझे लगता है कि यदि आपके पास व्यूपोर्ट 3 डी में कैमरा नहीं है तो यह इतना आसान नहीं है। आपको कैमरा परिवर्तन के साथ विजुअल 3 डी ट्रांसफॉर्मेशन के माध्यम से लिखना होगा।

सामान को व्यूपोर्ट 3 डी में रखना सबसे आसान होगा। फिर आपका प्रश्न इस जैसा है: Projecting a 3D point to a 2D screen coordinate और यह एक: 3D Projection information

ध्यान दें कि कुछ उत्तरों .NET 3.5 से पहले लिखे गए थे, जिसमें सहायक 3 विजुअल फंक्शन विजुअल 3 डी। ट्रान्सफॉर्मटोएस्टर, जो शायद आपको चाहिए। TransformToAncestor के बारे में अधिक जानकारी यहां: http://blogs.msdn.com/b/wpf3d/archive/2009/05/13/transforming-bounds.aspx

और यदि आप WPF 3 डी के साथ कुछ भी कर रहे हैं, तो आपको अद्भुत Helix Toolkit के बारे में जानने की आवश्यकता है, जो 3DTools के प्रतिस्थापन है, जिसमें व्यू नियंत्रण और विभिन्न सहायक शामिल हैं, और सक्रिय रूप से काम कर रहे हैं।