PyOpenGL을 배우기 시작했고, this 튜토리얼을 따르고 있습니다. 어느 곳에서 강사 그 삼각형 구성하는 정보를 추출하는 하나의 어레이 작성이 배열의 정보에 glVertexPointer() and glColorPointer()에 전달PyOpenGL의 단일 배열에서 glVertexPointer() 및 glColorPointer() 데이터를 추출하는 방법은 무엇입니까?
#-----------|-Vertices pos--|---Colors----|-----------
vertices = [-0.5, -0.5, 0.0, 1.0, 0.0, 0.0,
0.5, -0.5, 0.0, 0.0, 1.0, 0.0,
0.0, 0.5, 0.0, 0.0, 0.0, 1.0]
vertices = np.array(vertices, dtype = np.float32)
: vetices 그들의 색 (I 여기 NumPy와 라인을 추가) 디스플레이 기능 :
def display():
glClear(GL_COLOR_BUFFER_BIT)
glEnableClientState(GL_VERTEX_ARRAY)
glEnableClientState(GL_COLOR_ARRAY)
glVertexPointer(3, GL_FLOAT, 12, vertices)
glColorPointer(3, GLFLOAT, 12, vertices + 3)
glDrawArrays(GL_TRIANGLES, 0, 3)
glDisableClientState(GL_VERTEX_ARRAY)
glDisableClientState(GL_COLOR_ARRAY)
glutSwapBuffers()
내 문제는 (그가 C++를 사용하기 때문에), 그 세 번째 위치에서 읽기 시작하는 프로그램을 이야기하기 위해 vertices + 3
을 쓸 수 튜토리얼에서, 이러한 기능의 마지막 인수입니다 배열의, 나는 파이썬에서 이것을 할 수 없습니다. 이 포인터를 어떻게 정의 할 수 있습니까? 또는 어떻게 내 배열에서 정보를 추출 할 수 있습니다.
참고 : 각기 다른 배열의 정점 및 색상 정보를 나눌 수 있지만 하나의 배열을 사용하여 정점 및 색상 정보를 분리 할 수 있는지 알고 싶습니다.
편집 - 전체 코드 추가는 :
from OpenGL.GL import *
from OpenGL.GLUT import *
import numpy as np
import ctypes
#-----------|-Vertices pos--|---Colors----|-----------
vertices = [-0.5, -0.5, 0.0, 1.0, 0.0, 0.0,
0.5, -0.5, 0.0, 0.0, 1.0, 0.0,
0.0, 0.5, 0.0, 0.0, 0.0, 1.0]
vertices = np.array(vertices, dtype = np.float32)
buffer_offset = ctypes.c_void_p
float_size = ctypes.sizeof(ctypes.c_float)
#-----------------------------------------------------
def display():
glClear(GL_COLOR_BUFFER_BIT)
glEnableClientState(GL_VERTEX_ARRAY)
glEnableClientState(GL_COLOR_ARRAY)
glVertexPointer(3, GL_FLOAT, 24, buffer_offset(vertices.ctypes.data))
glColorPointer(3, GL_FLOAT, 24, buffer_offset(vertices.ctypes.data + float_size * 3))
glDrawArrays(GL_TRIANGLES, 0, 3)
glDisableClientState(GL_VERTEX_ARRAY)
glDisableClientState(GL_COLOR_ARRAY)
glutSwapBuffers()
def reshape(w,h):
glViewport(0,0,w,h)
def initOpenGL():
glClearColor(0,0,0,1)
#-----------------------------------------------------
glutInit()
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH)
glutInitWindowSize(500,500)
glutCreateWindow(b'Test')
glutDisplayFunc(display)
glutIdleFunc(display)
glutReshapeFunc(reshape)
initOpenGL()
glutMainLoop()
대단히 감사합니다. 마지막으로 추가 한 정보로 작업했습니다. 나는 아직도 무엇을하고 있는지 분명하지 않다. 그러나 나는 알아낼 것이다. 고맙습니다. –
당신을 진심으로 환영합니다! 'vertices.ctypes.data'는 배열의 주소를 반환합니다. 따라서 주소에서 첫 번째 4 바이트 (float의 크기)는 '꼭짓점'의 첫 번째 요소가됩니다 (4 바이트마다). 따라서 'address + 4 * 3'을 취하면 첫 번째 색상 요소의 주소가됩니다. 당신은 이미 스트라이드 (24 바이트)를 말하기 때문에 시작 주소 만 알면됩니다. 보폭은 6 개의 수레 (X, Y, Z, R, G, B)가 있기 때문에 24 바이트입니다. '6 floats * 4 float_size = 24 bytes'입니다. – Vallentin