glTranslatef();
を利用して、別の固定円から独立した1つの円を翻訳しようとしています。しかし、私の現在の完全なコードでは、私の各サークルは不動のままです。これがなぜそうであるかを調べるために、私はいくつかの解答を調査しました。それぞれはhereとhereと似ています。さらに、glLoadIdentityとGL_MODELVIEW and GL_PROJECTIONの違いを読み、詳細が明確になるかどうかを確認するだけです。上記のそれぞれの適切な定義については、OpenGL APIも参考にしました。これらのソリューションのスタイルでオブジェクトを互いに独立して正しく翻訳するにはどうすればよいですか?
が、私は以下のdo...while
ループ作成:このスニペットでは
do{
glClear(GL_COLOR_BUFFER_BIT);
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, fb_width, fb_height, 0, 0, 1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glTranslatef(0,1,0);
drawCircle(1280 * 0.50, 720 * 0.25,e[2]);
glPopMatrix();
glPushMatrix();
glTranslatef(0,0,0);
drawTarget(1280 * 0.50, 720 * 0.75,50);
glPopMatrix();
glfwSwapBuffers(w);
glfwPollEvents();
}
while (!glfwWindowShouldClose(w));
を、drawCircle
図面は静止しているが、それは代わりに書かれたglTranslatef(0,1,0)
に従うために私がしたいと思います。 glMatrixMode
またはglLoadIdentity
が間違って配置されているか、またはdo...while
ループ内で呼び出され、適切なマトリックスが実際に利用されていないことが原因です。私は上記の答えが私のプログラムの中でどうしてもうまく機能しない理由について、あなたが持っているかもしれないガイダンスを感謝します。あなたは、すべてのループで投影行列を作るループの前にそれを置く必要はありません
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdint.h>
#include <math.h>
#include <stddef.h>
#include <stdbool.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
GLFWwindow *w;
int fb_width, fb_height;
static void error(int error, const char *desc)
{
fputs(desc, stderr);
}
static void key_callback(GLFWwindow *w, int key, int scancode, int action, int mods)
{
if ((key == GLFW_KEY_ESCAPE || key == GLFW_KEY_Q) && action == GLFW_PRESS)
glfwSetWindowShouldClose(w, GL_TRUE);
}
void drawCircle(float cx, float cy, float radius)
{
float num_segments = 360;
float theta = 2 * 3.1415926/num_segments;
float c = cosf(theta);//precalculate the sine and cosine
float s = sinf(theta);
float t;
float x = radius;//we start at angle = 0
float y = 0;
glBegin(GL_TRIANGLE_FAN);
glColor3f(1, 0, 1);
for(int ii = 0; ii < num_segments; ii++)
{
glVertex2f(x + cx, y + cy);//output vertex
//apply the rotation matrix
t = x;
x = c * x - s * y;
y = s * t + c * y;
}
glEnd();
}
void drawTarget(float cx, float cy, float radius)
{
float num_segments = 360;
float theta = 2 * 3.1415926/num_segments;
float c = cosf(theta);//precalculate the sine and cosine
float s = sinf(theta);
float t;
float x = radius;//we start at angle = 0
float y = 0;
glBegin(GL_LINE_LOOP);
glColor3f(1, 1, 1);
for(int ii = 0; ii < num_segments; ii++)
{
glVertex2f(x + cx, y + cy);//output vertex
//apply the rotation matrix
t = x;
x = c * x - s * y;
y = s * t + c * y;
}
glEnd();
}
int main(void)
{
int i;
float e[3] = {140,120,100};
float m[3] = {90,80,70};
float h[3] = {60,50,40};
glfwSetErrorCallback(error);
if (!glfwInit())
exit(EXIT_FAILURE);
w = glfwCreateWindow(1280, 720, "AxTest", NULL, NULL);
if (!w)
{
glfwTerminate();
return 1;
}
glfwMakeContextCurrent(w);
glfwSetKeyCallback(w, key_callback);
glfwGetFramebufferSize(w, &fb_width, &fb_height);
do{
glClear(GL_COLOR_BUFFER_BIT);
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, fb_width, fb_height, 0, 0, 1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glTranslatef(0,1,0);
drawCircle(1280 * 0.50, 720 * 0.25,e[2]);
glPopMatrix();
glPushMatrix();
glTranslatef(0,0,0);
drawTarget(1280 * 0.50, 720 * 0.75,50);
glPopMatrix();
glfwSwapBuffers(w);
glfwPollEvents();
}
while (!glfwWindowShouldClose(w));
glfwDestroyWindow(w);
glfwTerminate();
exit(EXIT_SUCCESS);
return 0;
}
これを今試しました。残念ながら 'drawCircle'は動かないままです。このコードがしたように見えるのは、円中心オフセットを 'glTranslatef'に置くという負担を変えるだけです。それによって、翻訳が起こらず外観は変わっていません。実際の動きを確実にするために 'glTranslatef'を追加する必要がありますか? – zzz
@zzz: "モーション"? OpenGLは物事を描くだけです。実際に動き回るようにするには、アニメーションループを実装する必要があります。あなたのコードには、図面をアニメートすることはできません。 – datenwolf
あなたは正しいです。謝罪いたします。私は間違っていて、gltranslatef()について時間をかけて質問して動きを表示することを意図していましたが、それはおそらく別の質問です。 – zzz