سؤال

أرسم المباني في عالم لعبتي، وأظلها مع الكود التالي:

GLfloat light_ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};
GLfloat light_position[] = {135.66f, 129.83f, 4.7f, 1.0f};

glShadeModel(GL_SMOOTH);

glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);

glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);

glColorMaterial(GL_FRONT, GL_AMBIENT);

يعمل بشكل جيد.

ولكن عندما أبدأ الطيران في العالم، تتفاعل الإضاءة مع ذلك كما لو كان العالم كائن يتم تدويره. لذلك تتغير الأنوار عند تغييرات زاوية الكاميرا الخاصة بي.

كيف أعود إلى هذا الدوران؟ لذا فإن الإضاءة تعتقد أنني لست فعليا تدوير العالم، ثم بإمكاني أن أجعل مبنياتي تظليل ثابتة سيتغير اعتمادا على مكان وجود الشمس في السماء.

تحرير: هنا هو رمز التقديم:

int DrawGLScene()
{

    // stuff

    glLoadIdentity();

    glRotatef(XROT, 1.0f, 0.0f, 0.0f);
    glRotatef(YROT, 0.0f, 1.0f, 0.0f);
    glRotatef(ZROT, 0.0f, 0.0f, 1.0f);

    glTranslatef(-XPOS, -YPOS, -ZPOS);

    // draw world
}
هل كانت مفيدة؟

المحلول

http://www.opengl.org/resources/faq/technical/lights.htm.

انظر # 18.050.

باختصار، تحتاج إلى التأكد من أنك تحدد موقعك النور في الإطار المرجعي الصحيح وتطبيق التحويل المناسب لكل إطار للحفاظ عليه حيث تريد ذلك.

نصائح أخرى

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

لإصلاح هذا، ما عليك سوى إعادة وضع مصابيحك كلما قمت بنقل الكاميرا.

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