मेरे पास तीन समान दूरी वाले बक्से के साथ एक 3 डी दृश्य है, मैं चाहता हूं कि कैमरा कैमरे के लक्ष्य के चारों ओर घूमने और किसी भी दिशा में आगे बढ़ने में सक्षम हो, आमतौर पर 3 डी मॉडलिंग एप्लिकेशन में कैमरे की तरह, हालांकि मेरा सेटअप केवल तभी काम करता है जब मेरा कैमरा लक्ष्य है मूल स्थान पर स्थित, जब भी मैं कैमरे को किसी भी दिशा में ले जाता हूं तो मेरा कैमरा स्थिति और कैमरा लक्ष्य नई स्थिति में सही ढंग से अनुवाद करता है, हालांकि मेरा कैमरा अभी भी दृश्य के मूल के आसपास घूमता है

नीचे दी गई छवि समन्वय प्रणाली के मूल में मेरा कैमरा लक्ष्य और रोटेशन दिखाती है यहां छवि विवरण दर्ज करें

नीचे दी गई छवि से पता चलता है कि मेरा कैमरा लक्ष्य बाईं ओर स्थानांतरित हो गया है, हालांकि कैमरा समन्वय प्रणाली की उत्पत्ति के संबंध में घूमता है यहां छवि विवरण दर्ज करें

कैमरा रोटेशन और एक्स/वाई प्लेन पर मूवमेंट के लिए मेरा कोड निम्नलिखित है:

if (event.type == SDL_MOUSEMOTION && leftMouseButtonPressed == true)
{

    New.x = event.button.x;
    New.y = event.button.y;

    delta = New - prev;


    if (delta.x != 0) {

        angleX = delta.x / 2.0f;

        rotMat = glm::mat4(1);
        rotMat =   glm::rotate(rotMat, glm::radians(angleX), up);
        cameraUp = glm::normalize(glm::vec4(up, 1) * rotMat);
        cameraRight = glm::normalize(glm::cross(cameraUp, cameraDirection));
        cameraPos = rotMat * glm::vec4(cameraPos, 1) ;
        cameraDirection = glm::normalize(cameraPos - cameraTarget);

        camera = glm::lookAt(cameraPos, cameraTarget, up);


    }





if (event.type == SDL_MOUSEMOTION && rightMouseButtonPressed == true)
{

    New.x = event.button.x;
    New.y = event.button.y;

    delta = New - prev;


    if (delta.x != 0) {

        delta.x /= 10.0f;

        translateMat = glm::mat4(1);
        translateMat = glm::translate(translateMat, cameraRight * delta.x);
        cameraPos = translateMat * glm::vec4(cameraPos, 1);
        cameraTarget = translateMat * glm::vec4(cameraTarget, 1) ;


        camera = glm::lookAt(cameraPos, cameraTarget , cameraUp);


    }
0
BulBul 11 अक्टूबर 2018, 10:23

1 उत्तर

सबसे बढ़िया उत्तर

क्षैतिज और ऊर्ध्वाधर कोणों (यॉ और पिच) को संचित करें; हर बार ये बदलते हैं:

  • { का उपयोग करके रोटेशन मैट्रिक्स cameraRot बनाएं और कैश करें। yawPitchRoll फ़ंक्शन।
  • इस मैट्रिक्स का उपयोग करके कैमरे के सामने और ऊपर की दिशाओं की गणना और कैश करें:

    cameraDirection = cameraRot * glm::vec3(-1.0f, 0.0f, 0.0f);
    cameraUp = cameraRot * glm::vec3(0.0f, 1.0f, 0.0f);
    

    फ़्लोटिंग पॉइंट सटीक मुद्दों के लिए सहेजें, ये पहले से ही सामान्यीकृत हो जाएंगे।

  • इसके बाद कैमरे की स्थिति की गणना लक्ष्य से की जा सकती है:

    cameraPos = cameraTarget - cameraDistance * cameraDirection;
    

    जहां cameraDistance लक्ष्य से कैमरे की दूरी है।

1
meowgoesthedog 11 अक्टूबर 2018, 08:43