के रूप में काम नहीं कर रहा है मैं ओपनजीएल में एक स्काईबॉक्स के अंदर रोलरकोस्टर बना रहा हूं, और इसके कार्यों या कंप्यूटर ग्राफिक्स पर बहुत अधिक पृष्ठभूमि के बिना यह बहुत मुश्किल साबित हो रहा है। मैंने कैटमुल-रोम स्पलीन इंटरपोलेशन का उपयोग करके रोलरकोस्टर खींचा, और प्रत्येक बिंदु को glVertex3f के साथ खींचा। अब मैं ट्रैक के चारों ओर कैमरे को स्थानांतरित करने के लिए प्रत्येक 50ms पर update()
फ़ंक्शन को कॉल करना चाहता हूं। gluLookAt()
अजीब परिणाम उत्पन्न कर रहा है, या तो स्क्रीन से ट्रैक को हटा रहा है, एक ब्लैक स्क्रीन का उत्पादन कर रहा है। मुझे लगता है कि मुझे मैट्रिक्स कार्यों में से कुछ को स्थानांतरित करने की आवश्यकता है, लेकिन मुझे यकीन नहीं है कि प्रत्येक को कहां रखना है।ओपनजीएल gluLookAt() इच्छित
int main(int argc, char** argc)
{
// ... load track, etc ...
// Init currpos, nextpos, iter, up
currpos = Vec3f(0, 0, 0);
nextpos = currpos;
iter = 0;
up = Vec3f(0, 1, 0);
deque<Vec3f> points;
Vec3f newpt;
// Loop through the points and interpolate
for (pointVectorIter pv = g_Track.points().begin(); pv != g_Track.points().end(); pv++)
{
Vec3f curr(*pv); // Initialize the current point and a new point (to be drawn)
points.push_back(curr); // Push the current point onto the stack
allpoints.push_back(curr); // Add current point to the total stack
if (points.size() == 4) // Check if there are 4 points in the stack, if so interpolate
{
for (float u = 0.0f; u < 1.0f; u += 0.01f)
{
newpt = interpolate(points[0], points[1], points[2], points[3], u);
glColor3f(1, 1, 1);
glVertex3f(newpt.x(), newpt.y(), newpt.z());
allpoints.push_back(newpt);
}
points.pop_front();
}
}
// glutInit, InitGL(), etc...
}
void InitGL(GLvoid)
{
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(100.0, (GLfloat)WINDOW_WIDTH/(GLfloat)WINDOW_HEIGHT, .0001, 999999);
glMatrixMode(GL_MODELVIEW);
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
}
void display (void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(currpos.x(), currpos.y(), currpos.z(), nextpos.x(), nextpos.y(), nextpos.z(), up.x(), up.y(), up.z());
glPushMatrix();
glEnable(GL_TEXTURE_2D); // Enable texturing from now on
/* draw skybox, this was from previous assignment and renders correctly */
glPopMatrix();
// now draw rollercoaster ...
glPushMatrix();
glBegin(GL_LINE_STRIP);
deque<Vec3f> points;
Vec3f newpt;
for each (Vec3f pt in allpoints)
{
glColor3f(1, 1, 1);
glVertex3f(pt.x(), pt.y(), pt.z());
}
glutTimerFunc(50, update, 1);
glEnd();
glPopMatrix();
// Swap buffers, so one we just drew is displayed
glutSwapBuffers();
}
void update(int a)
{
if (iter < allpoints.size())
{
currpos = allpoints[iter];
nextpos = allpoints[iter + 1];
gaze = nextpos - currpos;
gaze.Normalize();
Vec3f::Cross3(binorm, gaze, up);
binorm.Normalize();
Vec3f::Cross3(up, binorm, gaze);
up.Normalize();
glutPostRedisplay();
}
iter++;
}
विचार यह है कि मैं एक वैश्विक Deque allpoints
कि पट्टी का नियंत्रण अंक और अंतर्वेशित अंक शामिल रख रहा हूँ है: यहाँ मेरी कोड अब तक है। एक बार यह पूरा होने के बाद, मैं प्रत्येक 50ms update()
पर कॉल करता हूं, और allpoints
में प्रत्येक बिंदु के साथ कैमरे को ले जाता हूं। प्रोजेक्ट के पिछले संस्करण में, मैं देख सकता था कि रोलरकोस्टर सही ढंग से खींचा जा रहा था। यह gluLookAt()
है जो काम नहीं करता है कि मैं इसे कैसे करना चाहता हूं। उपर्युक्त कोड के साथ, प्रोग्राम रोलरकोस्टर के एक हिस्से के साथ स्काईबॉक्स के एक तरफ देखे हुए कैमरे के साथ शुरू होता है, और फिर update()
कहा जाता है, रोलरकोस्टर गायब हो जाता है लेकिन कैमरा नहीं चलता है। मैं ओपनजीएल मैट्रिक्स फ़ंक्शंस डाल रहा हूं, जहां मैं कभी-कभी update()
पर एक रिक्त स्क्रीन का कारण बनता हूं, इस पर निर्भर करता हूं।
क्षमा करें, रोलर कोस्टर से पहले 'glPopMatrix() 'स्काईबॉक्स कोड के अंत में है (क्योंकि मैंने स्काईबॉक्स कोड शामिल नहीं किया है, इसलिए मैं इसे प्रश्न में भूल गया) - यह है कि इसे कहाँ जाना चाहिए, या रोलरकोस्टर ड्राइंग के बाद यह होना चाहिए? –
@Logan जबकि नियंत्रण प्रवाह रनटाइम पर समान हो सकता है, 'glPopMatrix'' glpushMatrix' के समान दायरे में होना चाहिए, क्योंकि दोनों एकता का प्रतिनिधित्व करते हैं और हमेशा जोड़ी में आते हैं। –
मेरा मतलब है, 'glPopMatrix() 'को स्काईबॉक्स कोड टिप्पणी के बाद होना चाहिए (आरसी को' glVertex3f' के साथ खींचा जाने से पहले) या लूप को 'glVertex3f' के साथ आरसी खींचने के बाद? –