2016-05-19 10 views
0

glTranslatef();を利用して、別の固定円から独立した1つの円を翻訳しようとしています。しかし、私の現在の完全なコードでは、私の各サークルは不動のままです。これがなぜそうであるかを調べるために、私はいくつかの解答を調査しました。それぞれはherehereと似ています。さらに、glLoadIdentityGL_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; 
} 

答えて

1

投影行列の値によって)。しかし、glTranslatesは小さい数字しか見ないので、シフトはわずかです(1ピクセル)ので、何も起こらなかったと思います。頂点位置のオフセットを明示的に変更してサークル/ターゲット中心を指定しないようにコードを書き直すと、より明確になります。

void drawCircle(float radius) 
{ 
    /* ... */ 
    for(int ii = 0; ii < num_segments; ii++) 
    { 
     glVertex2f(x, y); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    /* ... */ 
} 

void drawTarget(float radius) 
{ 

    /* ... */ 
    for(int ii = 0; ii < num_segments; ii++) 
    { 
     glVertex2f(x, y); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    /* ... */ 
} 

int main(void) 
{ 
    /* ... */ 
      glPushMatrix(); 
      glTranslatef(1280*0.50, 720*0.25, 0); 
      drawCircle(e[2]); 
      glPopMatrix(); 

      glPushMatrix(); 
      glTranslatef(1280 * 0.50, 720 * 0.25, 0); 
      drawTarget(50); 
      glPopMatrix(); 

    /* ... */ 
} 
+0

これを今試しました。残念ながら 'drawCircle'は動かないままです。このコードがしたように見えるのは、円中心オフセットを 'glTranslatef'に置くという負担を変えるだけです。それによって、翻訳が起こらず外観は変わっていません。実際の動きを確実にするために 'glTranslatef'を追加する必要がありますか? – zzz

+0

@zzz: "モーション"? OpenGLは物事を描くだけです。実際に動き回るようにするには、アニメーションループを実装する必要があります。あなたのコードには、図面をアニメートすることはできません。 – datenwolf

+0

あなたは正しいです。謝罪いたします。私は間違っていて、gltranslatef()について時間をかけて質問して動きを表示することを意図していましたが、それはおそらく別の質問です。 – zzz

-1
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0, fb_width, fb_height, 0, 0, 1); 

:完全な透明性のために

は、ここに私のコードの全体です。

次にあなたが持っているエラーが原因に確かにある:あなたがピクセルに対処したいので示されているように、あなたの円を描くれる頂点位置の値は数百(おそらく、の順である

glMatrixMode(GL_MODELVIEW);    
// it miss glLoadIdentity() here 
glPushMatrix(); 
glTranslatef(0,1,0); 
+0

フレーム反復ごとに投影行列を設定するのは良いスタイルです(たとえば、中間レンダリングにFBOを使用する場合など)。問題はそれがあなたが思うところではない。 – datenwolf

+0

1は翻訳には非常に小さいです。ここにあるので、それは単なるピクセルです。 gltranslateで50または100を試しましたか? – GLCraft

関連する問題