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()
~
~
登録:
コメントの投稿 (Atom)
About
リンク
連絡フォーム
ブログ アーカイブ
-
▼
2019
(66)
-
▼
8月
(11)
- pyopengl pyopengl ウォークスルー 視点の移動 動き回る
- opengl pyopengl glLogicOpの使い方
- opengl pyopengl jpg画像ファイルをテクスチャとして貼る
- opengl pyopengl tga画像ファイルをテクスチャで貼り付ける
- OpenGLのtgaファイルをテクスチャとして貼る
- g++コンパイルでエラー 文字列定数から「char *」への非推奨の変換
- opengl コンパイラオプション
- pyopengl opengl 四角形にチェッカー模様のテクスチャを貼り付ける2
- pyopengl opengl 四角形にチェッカー模様のテクスチャを貼り付ける
- pyopengl 立方体が2つマウス操作で回転、 チェス盤のテクスチャを立方体に貼る
- pyopenglでロボットアーム作成 opengl
-
▼
8月
(11)
0 件のコメント:
コメントを投稿