2017-07-29 4 views
1

Vispyを使用してテクスチャ付きクワッドを3Dで回転しようとしていますが、うまくいかないようです。コードには特別なエラーはありませんが、まったく回転していません。私はVispyを初めて使用しています。多分、私のコードにいくつかの重要なコンポーネントが欠けています。たぶんあなたの中にはすでにこれまでに同様の問題を解決した人がいます。私にいくつかの洞察を与えることは大きな助けになるでしょう。Vispyを使用してクワッドを3dで回転しようとしています

import numpy as np 

from vispy import gloo, app 
app.use_app('pyqt5') 
from vispy.gloo import Program 
from vispy.util.transforms import perspective, translate, rotate 
import imageio 


im = imageio.imread('C:\\vhosts\\VIDEO_TWO_CLONE\\fol1\\im.jpg') 


vertex = """ 
    uniform mat4 u_model; 
    attribute vec2 position; 
    attribute vec2 texcoord; 
    varying vec2 v_texcoord; 
    void main() 
    { 
     gl_Position = u_model * vec4(position, 0.0, 1.0); 
     v_texcoord = texcoord; 
    } """ 

fragment = """ 
    uniform sampler2D texture; 
    varying vec2 v_texcoord; 
    void main() 
    { 
     gl_FragColor = texture2D(texture, v_texcoord); 
    } """ 


def checkerboard(grid_num=8, grid_size=32): 
    row_even = grid_num // 2 * [0, 1] 
    row_odd = grid_num // 2 * [1, 0] 
    Z = np.row_stack(grid_num // 2 * (row_even, row_odd)).astype(np.uint8) 
    return 255 * Z.repeat(grid_size, axis=0).repeat(grid_size, axis=1) 


class Canvas(app.Canvas): 
    def __init__(self): 
     app.Canvas.__init__(self, size=(512, 512), title='Textured quad', 
          keys='interactive') 

     self.model = np.eye(4, dtype=np.float32) 
     # Build program & data 
     self.program = Program(vertex, fragment, count=4) 
     self.program['position'] = [(1, 1), (-1, 1), 
            (1, -1), (-1, -1)] 
     self.program['texcoord'] = [(0, 0), (1, 0), (0, 1), (1, 1)] 
     self.program['texture'] = im # checkerboard() 
     self.program['u_model'] = self.model 



     self.theta = 0 
     self.phi = 0 


     gloo.set_viewport(0, 0, *self.physical_size) 

     self.show() 

    def on_draw(self, event): 
     gloo.set_clear_color('white') 
     gloo.clear(color=True) 
     self.program.draw('triangle_strip') 


    def on_timer(self, event): 
     self.theta += .5 
     self.phi += .5 
     self.model = np.dot(rotate(self.theta, (0, 1, 0)), 
          rotate(self.phi, (0, 0, 1))) 
     self.program['u_model'] = self.model 
     self.update() 


    def on_resize(self, event): 
     gloo.set_viewport(0, 0, *event.physical_size) 

if __name__ == '__main__': 
    c = Canvas() 
    app.run() 

答えて

1

モデルの位置と回転を定義する行列を均一modelは、方法on_timerで設定 である:ここではコードです。 on_timerが実行されるたびに、モデル行列が変更され、モデルをローテーションします。 しかし、タイマーは決して起動されず、on_timerは決して実行されないようです。

タイマーを開始するには、初期化中にapp.Timerに電話する必要があります。

class Canvas(app.Canvas): 
    def __init__(self): 
     app.Canvas.__init__(self, size=(512, 512), title='Textured quad', keys='interactive') 

     ....... 

     self._timer = app.Timer('auto', connect=self.on_timer, start=True) 

vispy/examples/tutorial/app/interactive.py

を参照してください。 は、クラス Canvasのコンストラクタに次のコードのようなものを入れて
関連する問題