سؤال

وأنا أحاول أن تعلم أكثر من ذلك بقليل على vectormath من خلال كتابة راي التتبع البسيط ولقد تم القيام ببعض القراءة على ذلك، ولكن ما لم أكن قادرة على العثور هو كيفية تحديد اتجاه المرحلة الابتدائية أشعة. هذا يبدو وكأنه مشكلة بسيطة، وربما هو، ولكن مع معرفتي الحالية لم أكن قادرا على أنها من أصل الرقم.

وأنا أحسب أنني بحاجة إلى كاميرا (ليس أكثر من موقع واتجاه كما ناقلات) ومن الكاميرا I إطلاق أشعة الأولية على شاشة أمام الكاميرا التي تمثل الصورة النهائية. ما لا أستطيع معرفة هي الإحداثيات زاوية الشاشة. لو كنت أعرف الشاشة، والعثور على اتجاه الأشعة الأولية أمرا سهلا.

وأنا على أمل الشاشة يمكن أحسب باستخدام أي شيء ولكن الرياضيات البسيطة التي لا تتطلب أي المصفوفات التناوب. أفضل تصور عندي هو:

ولدي اتجاه الكاميرا كناقل، وهذا الاتجاه هو يساوي العادي من الطائرة من شاشة العرض. لذلك ليس لدي العادي من الشاشة، ومن هناك يمكنني بسهولة حساب وسط الشاشة وهي:

camera_location + (normal * distance) 

وأين المسافة هي المسافة بين الشاشة والكاميرا. ومع ذلك، حيث ان تضيع وأنا لا يمكن أن نجد طريقة لمعرفة إحداثيات الزاوية من الطائرة لأي اتجاه التعسفي من الكاميرا.

ويمكن لأي واحد منكم مساعدتي هنا؟ وإذا لي طريقة لا يمكن أن تنجح، ماذا؟

هل كانت مفيدة؟

المحلول

وتحرير: وإليك بعض التعليمات البرمجية التي يتم تقليل إلى حد كبير من التي سجلت في الأصل لأنه يغفل إنشاء viewMatrix. الذي يحتاج فقط لبعض بعض تقديم scanline للوغير مستعملة للراي البحث عن المفقودين.

والعمل الشاق هي وظيفة lookat ()، ولا سيما إنشاء 'حتى' وناقلات "حق". هذه يجب أن تكون متعامدة مع بعضها البعض، وكذلك لمكافحة ناقلات تشغيل ما بين العين ومركز الصورة. إنشاء تلك ناقلات يعتمد على وظيفة ناقلات عبر المنتج.

وظيفة الفعلية لصب أشعة تفترض أن العرض شاشة يمتد من -0.5 إلى +0.5 في الاتجاه Y. أن وظيفة بسيطة جدا، ومجرد تتكون من إضافة أبعاد الصحيحة من 'الرأي'، 'حتى' وناقلات "حق" معا.

public class Camera {

    protected Point3d       eye;
    protected Point3d       center;

    protected Vector3d      up;
    protected Vector3d      right;
    protected Vector3d      view;

    protected double        fovy;           // half FoV in radians
    protected double        tanf;
    protected double        aspect;

    public Ray castRay(double x, double y) {

        Vector3d dir = new Vector3d(view);
        Vector3d t = new Vector3d();
        t.scale(tanf * x * aspect, right);
        dir.add(t);
        t.scale(tanf * y, up);

        dir.add(t);
        dir.normalize();

        return new Ray(eye, dir);
    }

    /* algorithm taken from gluLookAt */
    public void lookAt(Point3d _eye, Point3d _center, Vector3d _up) {

        eye = new Point3d(_eye);
        center = new Point3d(_center);
        Vector3d u = new Vector3d(_up);

        Vector3d f = new Vector3d(center);
        f.sub(eye);
        f.normalize();

        Vector3d s = new Vector3d();
        u.normalize();
        s.cross(f, u);
        s.normalize();
        u.cross(s, f);

        view = new Vector3d(f);
        right = new Vector3d(s);
        up = new Vector3d(u);
    }

    /* algorithm taken from gluPerspective */
    public void setfov(double _fovy, double _aspect)
    {
        fovy = Math.toRadians(_fovy) / 2.0;
        tanf = Math.tan(fovy);
        aspect = _aspect;
    }
}

نصائح أخرى

وشكرا لكم على المعلومات. شخصيا، أنا لست مرتاحا جدا مع التحولات مصفوفة وترغب في تجنبها قدر الإمكان. ومع ذلك، من مشاركتك وأنا أفهم أن التحولات هي الطريقة الوحيدة لفعل ما أريد القيام به؟ التي من شأنها سيئة للغاية، لأنني أعتقد أنني كنت قريبة جدا (حصلت على وضعها الطبيعي والمنتصف للشاشة) ولظل يحب حل ناقل الرياضيات النقي.

وسأحاول أن تعتمد التعليمات البرمجية، ولكن للأسف أنا لا أعرف بالضبط ما يحدث داخليا في الأشياء الخاصة بك في بعض النقاط، وذلك أساسا في الكائنات Matrix4d.

وPS: إذا كنت ترغب في الرد على إجابة على ستاكوفيرفلوو كما الخالق من السؤال، هل من المفترض أن أدلي بتعليق على هذا الجواب، أو هو موافق لإنشاء "الجواب" الجديدة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top