2019年8月11日日曜日

pyopengl opengl 四角形にチェッカー模様のテクスチャを貼り付ける2





#coding:utf-8
# [2019-08-02]

#参考サイト
#グラフィックス科学演習 #テクスチャ
#http://web.wakayama-u.ac.jp/~wuhy/GSS/07.html#8.1
#PyOpenGL 6 テクスチャ
# http://www.not-enough.org/abe/manual/api-aa09/pyopengl6.html

#ファイル名 texture_02.py

"""
@@@ テクスチャ
@@@ 青黄色のチェッカー模様をつける
@@@ h j で回転
"""
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import sys
import struct

vertex = [
    [-1.0, 0.0, 1.0],
    [1.0, 0.0, 1.0],
    [1.0, 0.0, -1.0],
    [-1.0, 0.0, -1.0]
    ]
face = [
    [0, 1, 2, 3]
    ]
uvcoord = [
    [0.0, 0.0],
    [1.0, 0.0],
    [1.0, 1.0],
    [0.0, 1.0]
    ]

angleX = 0.0
angleY = 0.0

#struct.pack(フォーマット、値)
#255, 0, 0 を3バイトのバイナリデータにして、data に追加します。
#struct.pack('BBB', 255, 0, 0)
def maketex():
    w = 32 #テクスチャの横方向の解像度
    h = 32 #テクスチャの縦方向の解像度
    n = 2  #テクスチャの繰り返し回数
    data = ''
    for x in range(w):
        for y in range(h):
            #テクスチャにどちらの色をつけるか計算
            #(0~31)%16 < 8 (0~15,0~15) < 8 (0~7)(8~15)(0~7)(8~15) < 8
            #xx = 1,0,1,0  yy = 1,0,1,0
            xx = x % (w/n) < w/(n*2)
            yy = y % (h/n) < h/(n*2)
            #排他的論理和
            #xx yy  xx ^ yy
            #0  0   0
            #1  0   1
            #0  1   1
            #1  1   0
            if xx ^ yy:
                data += struct.pack('BBB', 255, 0, 0)#赤色
            else:
                data += struct.pack('BBB', 0, 255, 0)#緑(黄色に見える)

        #引数が1でも4でもglPixelStoreiがなかろうが関係なしだった。 
        #glPixelStorei(GL_UNPACK_ALIGNMENT, 1)

        #下コードコメントアウトしても変わらず。テクスチャが一つだけか
        #らか
        ##*glGenTextures* テクスチャの番号を得る引数テクスチャの個数
        #tex = glGenTextures(1)
        ##*glBindTexture*テクスチャを選択する
        ##1番め引数1次元テクスチャ 2番め引数 テクスチャの番号
        #glBindTexture(GL_TEXTURE_2D, tex)
        #2次元テクスチャを作成 配列の内容をテクスチャバッファに格納する

        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
                w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, data)

#resizeはウィンドウリサイズ時と最初に一回実行される
def resize(w,h):
    print "resize"
    glViewport(0,0,w,h)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    #glOrtho(-w/300, w/300, -h/300, h/300, -1.0, 1.0)
    #glFrustum(-3.0, 3.0, -3.0, 3.0, 5.0, 10000.0)
    #gluPerspective(20.0, w/h, 1.0, 10.0)
    gluPerspective(30.0, w/h, 1.0, 100.0)
    #glTranslated(0.0, 0.0, -5.0)
    glMatrixMode(GL_MODELVIEW)

    #glLoadIdentity()
    #glTranslated(0.0, 0.0, -5.0 )
    #gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)


def display():
    print "display"

    global angleX, angleY
    glClearColor(0.0, 0.0, 1.0, 0.0)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glLoadIdentity()
    #図形を真上から見てみる
    gluLookAt(0.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0)
    #元コード
    #gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)

    glRotated(angleX, 1.0, 0.0, 0.0)
    glRotated(angleY, 0.0, 1.0, 0.0)

    #2次元テクスチャを使用可能にします。
    glEnable(GL_TEXTURE_2D)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)

    glBegin(GL_QUADS)
    #なんでわざわざfaceを2次元配列にしているか
    #face=[0][0~3] j=0
    for j in range(len(face)):
        for i in range(4):
            #n=0~3
            n = face[j][i]
            #glTexCoord2fでテクスチャ座標と図形座標の関連付け
            glTexCoord2f(uvcoord[n][0], uvcoord[n][1])
            glVertex(vertex[n])
    glEnd()

    glFlush()
    glutSwapBuffers()


def keyboard(key, x, y):
    global angleX, angleY
    if key == 'q' or key == 'Q':
        sys.exit()
    elif key == 'h':
        angleY += 1.0
        glutPostRedisplay()
    elif key == 'j':
        angleX += 1.0
        glutPostRedisplay()

def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
    #glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE)
    #glutInitDisplayMode(GLUT_RGBA)
    glutInitWindowSize(320, 320)
    #glutInitWindowPosition(200, 50)
    glutCreateWindow("PyOpenGL")
    #init()
    glutDisplayFunc(display)

    glutReshapeFunc(resize)
    #glutTimerFunc(5 , idle , 0)
    glutKeyboardFunc(keyboard)
    #glutMouseFunc(mouse)
    #特殊なキーの入力を受け付ける
    #*glutSpecialFunc*
    #glutSpecialFunc(special_key)

    #glClearColor(0.0, 0.0, 1,0, 0.0)
    glEnable(GL_DEPTH_TEST)
    glEnable(GL_CULL_FACE)
    glCullFace(GL_BACK)

    maketex()

    glutMainLoop()

if __name__ == "__main__":
    main()

~                                                                             
~                                             

0 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ブログ アーカイブ

ページ

Featured Posts