Python之OpenGL筆記 9 旋轉變換

2021-10-01 01:34:31 字數 3865 閱讀 9111

1、使用glsl實現圖形的旋轉。

旋轉變換,就是說給定乙個角度和點,我們將點繞著乙個座標軸旋轉。在旋轉過程中發生變化的總是x,y,z三個座標裡面的其中兩個,而不讓第三個座標值變化。這意味著,旋轉路徑總在三個座標軸平面中的乙個之中:繞 z 軸的是 xy 面、繞 x 軸的是 yz 面、繞 y 軸的是 xy 面。當然還有許多複雜的旋轉變換可以讓你繞任意乙個向量旋轉。

對於三維空間上的一點(x,y,z),繞z 軸旋轉a弧度,我們使用4*4齊次矩陣的形式來表示:

1、theta = i*pi/180.0 角度轉換為弧度;程式中旋轉了45度。

2、向量vec4(cos(theta),sin(theta),0.0,0)表示的是第1列,矩陣運算後,點(x,y)繞z軸旋轉theta弧度到(xcos(theta)-ysin(theta),xsin(theta)+ycos(theta))處。

"""

glfw_square03.py

author: dalong10

description: draw a square, learning opengl

"""import glutils #common opengl utilities,see glutils.py

import sys, random, math

import opengl

from opengl.gl import *

from opengl.gl.shaders import *

import numpy

import numpy as np

import glfw

strvs = """

#version 330 core

layout(location = 0) in vec3 position;

uniform float theta;

void main()

"""strfs = """

#version 330 core

out vec3 color;

void main()

"""class firstsquare:

def __init__(self, side):

self.side = side

# load shaders

self.program = glutils.loadshaders(strvs, strfs)

gluseprogram(self.program)

s = side/2.0

vertices = [

-s, s, 0,

s, s, 0,

s, -s, 0 ,

-s, -s, 0

]# set up vertex array object (vao)

self.vao = glgenvertexarrays(1)

glbindvertexarray(self.vao)

# set up vbos

vertexdata = numpy.array(vertices, numpy.float32)

self.vertexbuffer = glgenbuffers(1)

glbindbuffer(gl_array_buffer, self.vertexbuffer)

glbufferdata(gl_array_buffer, 4*len(vertexdata), vertexdata,

gl_static_draw)

#enable arrays

self.vertindex = 0

glenablevertexattribarray(self.vertindex)

# set buffers

glbindbuffer(gl_array_buffer, self.vertexbuffer)

glvertexattribpointer(0, 3, gl_float, gl_false, 0, none)

# unbind vao

glbindvertexarray(0)

def render(self):

# use shader

gluseprogram(self.program)

theta = i*pi/180.0

gluniform1f(glgetuniformlocation(self.program, "theta"), theta)

# bind vao

glbindvertexarray(self.vao)

# draw

gldrawarrays(gl_line_loop, 0, 4)

# unbind vao

glbindvertexarray(0)

if __name__ == '__main__':

import sys

import glfw

import opengl.gl as gl

def on_key(window, key, scancode, action, mods):

if key == glfw.key_escape and action == glfw.press:

glfw.set_window_should_close(window,1)

# initialize the library

if not glfw.init():

sys.exit()

# create a windowed mode window and its opengl context

window = glfw.create_window(300, 300, "rotation square ", none, none)

if not window:

glfw.terminate()

sys.exit()

# make the window's context current

glfw.make_context_current(window)

# install a key handler

glfw.set_key_callback(window, on_key)

pi = 3.14159265358979323846264

# loop until the user closes the window

while not glfw.window_should_close(window):

# render here

width, height = glfw.get_framebuffer_size(window)

ratio = width / float(height)

gl.glviewport(0, 0, width, height)

gl.glclear(gl.gl_color_buffer_bit)

gl.glclearcolor(0.0,0.0,4.0,0.0)

firstsquare0 = firstsquare(1.0)

i=45.0

firstsquare0.render()

# swap front and back buffers

glfw.swap_buffers(window)

# poll for and process events

glfw.poll_events()

glfw.terminate()

Python之OpenGL學習筆記摘要

一 視窗工具包glfw安裝 opengl open graphics library pyopengl庫函式 glfw python視窗工具包 注 另存 二 現代opengl程式設計常用幾個通用函式 三維幾何圖形定義 vbo等 通過定義在三維空間中三角形的頂點,並指定每個頂點相關聯顏色,定義三維幾何...

OpenGL學習筆記之了解OpenGL

opengl 全寫open graphicslibrary 是個定義了乙個跨程式語言 跨平台的程式設計介面規格的專業的圖形程式介面。它用於三維影象 二維的亦可 是乙個功能強大,呼叫方便的底層圖形庫。說白了,就是opengl是乙個開放的三維圖形軟體包,它獨立於視窗系統和作業系統,以它為基礎開發的應用程...

Python之OpenGL筆記 8 平移變換

1 使用glsl實現圖形的平移。平移變換的任務是將乙個物件沿著乙個任意長度和方向的向量移動。對於三維空間上的一點 x,y,z 我們使用4 4齊次矩陣的形式來表示平移變換 使用四維向量來表示三維向量的做法稱作齊次座標,這對3d圖形學來說普遍而又實用。向量的第四個分量稱之為 w 事實上,我們在以前教程中...