OpenGLで三角形を回転させるにはどうすればよいですか?

ぎっぺうみ

OpenGLで三角形を回転させ、RaspberryPiでプログラムを実行したいと思います。

三角形を描いて動かすことができます。しかし、私はそれを回転させる考えがありません..何も回転しません。

#include <cstdio>
#include <ctime>
#include <cmath>
#include <string>

#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <GLES2/gl2.h>
#include <GLES/gl.h>

#include <bcm_host.h>

EGLDisplay Disp;
EGLSurface Surface;
EGLContext Context;

int ScrWidth, ScrHeight;

float MVPMatrix[16];
float ProjectionMatrix[16];
float ViewMatrix[16];

using namespace std;

class Shader
{
    private:
    string VertexShaderFile;
    string FragmentShaderFile;
    GLuint Load(GLenum type, string FileName)
    {
        (Compile shader)
    }

    GLuint Program;
    bool Linked;
    public:
    Shader(string FileNameV, string FileNameF)
    {
        Linked = false;
        VertexShaderFile = FileNameV;
        FragmentShaderFile = FileNameF;
    }
    bool Load()
    {
        (Link vertex/fragment shader)
    }

    void Use()
    {
        glUseProgram(Program);
    }

    int GetAttrLoc(const char *Name)
    {
        glGetAttribLocation(Program, Name);
    }

    int GetUniformLoc(const char *Name)
    {
        return glGetUniformLocation(Program, Name);
    }

    ~Shader()
    {
        if(Linked)
        {
            Linked = false;
            glDeleteProgram(Program);
        }
    }
};

class Triangle
{
    private:
    const int COORDS_PER_VERTEX = 3;
    const int vertexCount = 9 / COORDS_PER_VERTEX;  //9: Length of triangleCoords
    const int vertexStride = COORDS_PER_VERTEX * 4; // 4 bytes per vertex
    static float TriangleCoords [];
    float Color[4];
    float XOff;
    float YOff;
    float ZOff;
    Shader *S;
    public:

    Triangle()
    {
        XOff = YOff = ZOff = 0;
        S = new Shader("Shaders/test.vsh", "Shaders/test.fsh");
        if (!S->Load())
        {
            delete S;
            S = NULL;
        }
    }

    void SetColor(int R, int G, int B, int A)
    {
        Color[0] = R / 255.0;
        Color[1] = G / 255.0;
        Color[2] = B / 255.0;
        Color[3] = A / 255.0;
    }

    void SetXYZ(int X, int Y, int Z)
    {
        (Sets position)
    }

    bool Draw()
    {
        float TriangleCoords[] = {   // in counterclockwise order:
            -0.0 + XOff, 0.622008459 + YOff, 0.0 + ZOff, // top
            -0.5 + XOff, -0.311004243 + YOff, 0.0 + ZOff, // bottom left
            0.5 + XOff, -0.311004243 + YOff, 0.0 + ZOff  // bottom right
        };
        printf("%f\n", TriangleCoords[1]);

        //glMatrixMode(GL_PROJECTION);
        if (S == NULL)
            return false;
        S->Use();
        // Load the vertex data
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, TriangleCoords);
        // get handle to shape's transformation matrix
        // Pass the projection and view transformation to the shader
        //UniformMatrix4fv(S->GetUniformLoc("uMVPMatrix"), 1, false, MVPMatrix);
        glUniform4fv(S->GetUniformLoc("vColor"), 1, Color);
        glEnableVertexAttribArray(0);
        //glPushMatrix();
        glLoadIdentity();
        glMatrixMode(GL_MODELVIEW);
        float X = LocalTime->tm_hour / 23.0;
        float Y = LocalTime->tm_min / 59.0;
        float Z = LocalTime->tm_sec / 59.0;
        glTranslatef(0, 0, 1);
        glRotatef(60, 1.f, 0.f, 0.f);
        glRotatef(30, 0.f, 1.f, 0.f);
        glRotatef(30, 0.f, 0.f, 1.f);
        glDrawArrays(GL_TRIANGLES, 0, 3);
        //glPopMatrix();
        return true;
    }
};

bool InitDisplay()
{
    bcm_host_init();
    Disp = eglGetDisplay(EGL_DEFAULT_DISPLAY);
    if(eglInitialize(Disp, NULL, NULL) != EGL_TRUE)
    {
        printf("Display initialize error.\n");
        return false;
    }
    printf("Display initialized.\n");


    static const EGLint AttrList[] =
    {
        EGL_RED_SIZE, 8,
        EGL_GREEN_SIZE, 8,
        EGL_BLUE_SIZE, 8,
        EGL_ALPHA_SIZE, 8,
        EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
        EGL_NONE
    };
    EGLConfig Config;
    int ConfigCount;
    if(eglChooseConfig(Disp, AttrList, &Config, 1, &ConfigCount) != EGL_TRUE)
    {
        printf("Display choose config error.\n");
        return false;
    }
    printf("Display config chosen. %d configs.\n", ConfigCount);


    //if(eglBindAPI(EGL_OPENGL_ES_API) != EGL_TRUE)
    //{
    //  printf("Bind API error.\n");
    //  return false;
    //}
    //printf("API bound.\n");


    static const EGLint ContextAttr[] =
    {
        EGL_CONTEXT_CLIENT_VERSION, 2,
        EGL_NONE
    };

    if((Context = eglCreateContext(Disp, Config, EGL_NO_CONTEXT, ContextAttr)) == EGL_NO_CONTEXT)
    {
        printf("Create context error.\n");
        return false;
    }
    printf("Context created.\n");



    if(graphics_get_display_size(0 /* LCD */, &ScrWidth, &ScrHeight) < 0)
    {
        printf("Get screen size error.\n");
        return false;
    }
    printf("Got screen size. %dx%d\n", ScrWidth, ScrHeight);


    DISPMANX_DISPLAY_HANDLE_T DispmanDisp;
    DispmanDisp = vc_dispmanx_display_open(0 /* LCD */);
    printf("Dispmanx - Display opened.\n");


    DISPMANX_UPDATE_HANDLE_T DispmanUpdate;
    DispmanUpdate = vc_dispmanx_update_start(0);
    printf("Dispmanx - Update started.\n");


    DISPMANX_ELEMENT_HANDLE_T DispmanElement;   
    VC_RECT_T DestRect;
    VC_RECT_T SrcRect;
    DestRect.x = 0;
    DestRect.y = 0;
    DestRect.width = ScrWidth;
    DestRect.height = ScrHeight;
    SrcRect.x = 0;
    SrcRect.y = 0;
    SrcRect.width = ScrWidth << 16;
    SrcRect.height = ScrHeight << 16;   
    DispmanElement= vc_dispmanx_element_add(
                DispmanUpdate,
                DispmanDisp,
                0/*layer*/,
                &DestRect,
                0/*src*/,
                &SrcRect,
                DISPMANX_PROTECTION_NONE, 
                0 /*alpha*/,
                0/*clamp*/,
                0/*transform*/
                );
    printf("Dispmanx - Element added.\n");

    static EGL_DISPMANX_WINDOW_T NativeWindow;
    NativeWindow.element = DispmanElement;
    NativeWindow.width = ScrWidth;
    NativeWindow.height = ScrHeight;
    vc_dispmanx_update_submit_sync(DispmanUpdate);
    printf("Dispmanx - Sync submited.\n");

    if((Surface = eglCreateWindowSurface(Disp, Config, &NativeWindow, NULL)) == EGL_NO_SURFACE)
    {
        printf("Create surface error.\n");
        return false;
    }
    printf("Surface created\n");

    if(eglMakeCurrent(Disp, Surface, Surface, Context) != EGL_TRUE)
    {
        printf("Make onnection between context and surface error.\n");
        return false;
    }
    printf("Connection made between context and surface.\n");

    glEnable(GL_CULL_FACE);
    glMatrixMode(GL_MODELVIEW);
    printf("Graphics system ready.\n");
    return true;
}

void makeFrustum(float fovY, float aspectRatio, float front, float back)
{
    const float DEG2RAD = 3.14159265 / 180;

    float tangent = tan(fovY / 2 * DEG2RAD);   // tangent of half fovY
    float height = front * tangent;          // half height of near plane
    float width = height * aspectRatio;      // half width of near plane

    // params: left, right, bottom, top, near, far
    glFrustumf(-width, width, -height, height, front, back);
}

void DrawLoop()
{
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    glViewport(0, 0, ScrWidth, ScrHeight);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    makeFrustum(45.0, ScrWidth / (float)ScrHeight, 1, 500);
    glEnableClientState(GL_VERTEX_ARRAY);
    Triangle T1;
    Triangle T2;
    Triangle T3;
    Triangle T4;

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.f, 0.f, -50.f);

    while (1)
    {
        time_t Time;
        time(&Time);
        tm *LocalTime = localtime(&Time);

        printf("%d:%d:%d\n", LocalTime->tm_hour, LocalTime->tm_min, LocalTime->tm_sec);
        float R = LocalTime->tm_hour / 23.0;
        float G = LocalTime->tm_min / 59.0;
        float B = LocalTime->tm_sec / 59.0;

        T1.SetColor(255, 0, 0, 255);
        T1.SetXYZ(B * ScrWidth, B * ScrHeight, 0);

        //glClearColor(0, 0, 0, 1.0);
        //glClear(GL_COLOR_BUFFER_BIT);
        if (!T1.Draw() || !T2.Draw() || !T3.Draw() || !T4.Draw())
        {
            return;
        }

        glFlush();
        eglSwapBuffers(Disp, Surface);
    }
}

int main()
{
    if(!InitDisplay())
    {
        printf("Display initialize error.\n");
        return false;
    }
    DrawLoop();
    return 0;
}

三角形を回転させるにはどうすればよいですか?

動作するコードを参照しましたが、それでも回転しません。

solidpixel

OpenGL ES2.0コンテキストでOpenGLES 1.1関数(glLoadIdentity、glMatrixMode、glTranslatef、glRotatefなど)を使用しようとしています-これは機能しません。OpenGL ES1.1またはOpenGLES 2.0のいずれかを使用できますが、同じコンテキストから両方を同時に使用することはできません。

シェーダーを使用してOpenGLES 2.0を使い続け、OpenGL ES 2.0のやり方を学ぶことをお勧めします。これは、すべての新しいAPIがどのように機能するかを示しています。

平行移動と回転を行うには、それをMVPマトリックスにエンコードし、これをユニフォームとして、gl_Positionの計算時に使用する頂点シェーダーに渡す必要があります。ここにいくつかの例:

https://open.gl/transformations

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

エッジの周りで三角形を回転させるにはどうすればよいですか?

分類Dev

台形を印刷するためにJavaで三角形を回転、インデント、描画するにはどうすればよいですか?

分類Dev

下の三角形だけをggpairsで表示するにはどうすればよいですか?

分類Dev

UWPで三角形ボタンを実行するにはどうすればよいですか?

分類Dev

2の累乗を三角形で印刷するにはどうすればよいですか?

分類Dev

三角形の内側に境界線を作成するにはどうすればよいですか?

分類Dev

配列を特定の三角形に印刷するにはどうすればよいですか?

分類Dev

下部に全幅の三角形を作成するにはどうすればよいですか?

分類Dev

JavaFXを使用して三角形を作成するにはどうすればよいですか?

分類Dev

三角形のQWidgetを作成するにはどうすればよいですか?

分類Dev

三角形の位置を計算して作成するにはどうすればよいですか?

分類Dev

正三角形の座標を計算するにはどうすればよいですか?

分類Dev

正三角形の座標を計算するにはどうすればよいですか?

分類Dev

JavaFXでポイントを中心に三角形を回転させ、ポイントの値を取得するにはどうすればよいですか?

分類Dev

OpenGLを使用して画面に三角形を表示するにはどうすればよいですか?

分類Dev

6つの三角形のSCNNodeで六角形を作成するにはどうすればよいですか?

分類Dev

6つの三角形のSCNNodeで六角形を作成するにはどうすればよいですか?

分類Dev

6つの三角形のSCNNodeで六角形を作成するにはどうすればよいですか?

分類Dev

6つの三角形のSCNNodeで六角形を作成するにはどうすればよいですか?

分類Dev

Python / PsychoPyで直角三角形を描くにはどうすればよいですか?

分類Dev

四角形の数学的な三角形の角度を固定するにはどうすればよいですか?

分類Dev

三角形関数を再帰的に書くにはどうすればよいですか?

分類Dev

親divの高さにスケーリングするCSSで三角形を作成するにはどうすればよいですか?

分類Dev

css `clip-path`で作成された三角形にシャドウを追加するにはどうすればよいですか?

分類Dev

Material ui-コーナーに小さな三角形を追加するにはどうすればよいですか?

分類Dev

テーブルセルの右下に小さな緑色の三角形を追加するにはどうすればよいですか?

分類Dev

三角形のサイズを小さくして位置を変更するにはどうすればよいですか?

分類Dev

三角形が不等辺三角形、二等辺三角形、正三角形、または三角形でないかどうかをチェックするJAVAプログラム

分類Dev

WPFToolkitのDataPointStyleを円形から正方形、三角形などに変更するにはどうすればよいですか?

Related 関連記事

  1. 1

    エッジの周りで三角形を回転させるにはどうすればよいですか?

  2. 2

    台形を印刷するためにJavaで三角形を回転、インデント、描画するにはどうすればよいですか?

  3. 3

    下の三角形だけをggpairsで表示するにはどうすればよいですか?

  4. 4

    UWPで三角形ボタンを実行するにはどうすればよいですか?

  5. 5

    2の累乗を三角形で印刷するにはどうすればよいですか?

  6. 6

    三角形の内側に境界線を作成するにはどうすればよいですか?

  7. 7

    配列を特定の三角形に印刷するにはどうすればよいですか?

  8. 8

    下部に全幅の三角形を作成するにはどうすればよいですか?

  9. 9

    JavaFXを使用して三角形を作成するにはどうすればよいですか?

  10. 10

    三角形のQWidgetを作成するにはどうすればよいですか?

  11. 11

    三角形の位置を計算して作成するにはどうすればよいですか?

  12. 12

    正三角形の座標を計算するにはどうすればよいですか?

  13. 13

    正三角形の座標を計算するにはどうすればよいですか?

  14. 14

    JavaFXでポイントを中心に三角形を回転させ、ポイントの値を取得するにはどうすればよいですか?

  15. 15

    OpenGLを使用して画面に三角形を表示するにはどうすればよいですか?

  16. 16

    6つの三角形のSCNNodeで六角形を作成するにはどうすればよいですか?

  17. 17

    6つの三角形のSCNNodeで六角形を作成するにはどうすればよいですか?

  18. 18

    6つの三角形のSCNNodeで六角形を作成するにはどうすればよいですか?

  19. 19

    6つの三角形のSCNNodeで六角形を作成するにはどうすればよいですか?

  20. 20

    Python / PsychoPyで直角三角形を描くにはどうすればよいですか?

  21. 21

    四角形の数学的な三角形の角度を固定するにはどうすればよいですか?

  22. 22

    三角形関数を再帰的に書くにはどうすればよいですか?

  23. 23

    親divの高さにスケーリングするCSSで三角形を作成するにはどうすればよいですか?

  24. 24

    css `clip-path`で作成された三角形にシャドウを追加するにはどうすればよいですか?

  25. 25

    Material ui-コーナーに小さな三角形を追加するにはどうすればよいですか?

  26. 26

    テーブルセルの右下に小さな緑色の三角形を追加するにはどうすればよいですか?

  27. 27

    三角形のサイズを小さくして位置を変更するにはどうすればよいですか?

  28. 28

    三角形が不等辺三角形、二等辺三角形、正三角形、または三角形でないかどうかをチェックするJAVAプログラム

  29. 29

    WPFToolkitのDataPointStyleを円形から正方形、三角形などに変更するにはどうすればよいですか?

ホットタグ

アーカイブ