2017/09/14(木) [n年前の日記]
#1 [pi3d][python][raspberrypi] pi3dで画像を表示する。その2
pi3d で画像を表示できたけど、只の静止画状態では今一つなので試しに動かしてみたり。
_imagesprite3.py
_ufo.png
_DXRubyでインチキ多関節を試してみる をpi3dでもやってみた、みたいな。
_imagesprite3.py
_ufo.png
u"""
pi3d ImageSprite sample.
スプライトを描画するサンプル。
透視投影で描画しつつグネグネ動かす。
ESCキーで終了する。
Windows10 x64 + Python 2.7.12 32bit + pi3d 2.20
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
from math import radians
from math import sin
import pi3d
# ウインドウ生成
display = pi3d.Display.create(w=640, h=480, frames_per_second=60)
# シェーダーを生成。uv_flatは照明関係の計算をしない。
shader = pi3d.Shader("uv_flat")
# カメラを透視投影に
camera = pi3d.Camera(is_3d=True)
# テクスチャを読み込み
tex = pi3d.Texture("ufo.png")
# スプライトをたくさん生成
sprs = []
num = 30
for i in range(num):
spr = pi3d.ImageSprite(tex, shader, w=10.0, h=10.0)
sprs.append(spr)
# キーボード取得用クラスを生成
keys = pi3d.Keyboard()
bs_z = 50.0
x_ang, y_ang, z_ang = 0.0, 0.0, 0.0
# メインループ
while display.loop_running():
x_ang = (x_ang + 3.0) % 360.0
y_ang = (y_ang + 4.0) % 360.0
z_ang = (z_ang + 2.2) % 360.0
# 先っぽ
tx = 0.0
ty = 0.0
tz = 30.0 * sin(radians(z_ang)) + bs_z
# 根元
bx = 0.0
by = 0.0
bz = tz + 200.0
dx = (tx - bx) / num
dy = (ty - by) / num
dz = (tz - bz) / num
for i, spr in enumerate(sprs):
x = bx + (dx * i) + (15.0 * sin(radians(x_ang + (10.0 * i))))
y = by + (dy * i) + (12.0 * sin(radians(y_ang + (25.0 * i))))
z = bz + (dz * i)
spr.position(x, y, z) # スプライトの座標を設定
spr.draw() # スプライトを描画
if keys.read() == 27:
# ESCキーが押されたらループを抜けて終了
keys.close()
display.destroy()
break
_DXRubyでインチキ多関節を試してみる をpi3dでもやってみた、みたいな。
◎ Raspberry Pi Zero W上で動かしてみたのだけど。 :
上記のソレは Windows10 上で動かした場合の結果だけど、試しに Raspberry Pi Zero W上で動かしたら、とんでもなく遅かった…。まさかここまで遅くなるとは…。ちゃんと測ってないけど、5〜6FPSしか出てないんじゃないかなあ…。
スプライト枚数を減らして動作確認してみたら、減らせば減らしただけフレームレートが改善されていったので、どうも大量に描画するのは厳しいみたいだなと。…この程度で息も絶え絶えでは困るんだけど。
ただ、 _pi3d_demos/SpriteBalls.py を動かすと、大量に画像が表示されてるのに、40FPS以上は出てるし…。工夫次第でどうにかなる可能性もありそうな。
スプライト枚数を減らして動作確認してみたら、減らせば減らしただけフレームレートが改善されていったので、どうも大量に描画するのは厳しいみたいだなと。…この程度で息も絶え絶えでは困るんだけど。
ただ、 _pi3d_demos/SpriteBalls.py を動かすと、大量に画像が表示されてるのに、40FPS以上は出てるし…。工夫次第でどうにかなる可能性もありそうな。
◎ 画像の代わりに球を出してみた。 :
もしや画像を描画すると遅くなるのかなと疑問が湧いたので、試しに ImageSprite ではなく Sphere にして、Zero W上で動作確認してみたり。
_spheres.py
残念ながら、見た目でほとんど変わらなかった。やっぱり遅い…。遅過ぎる…。
ということは、描画しようとしてるオブジェクトの種類に関係なく、とにかく大量に出した時点で遅くなるようだなと…。大量と言っても、この場合、30個程度なんだけどなあ。ファミコンですらスプライト64枚、MSXですら32枚だった(らしい)のに…。
オブジェクトの発生個数や座標計算のあたりはそのままにして、描画する個数のみを1〜3個にしてみたところ、滑らかに動いた。ということは…描画で処理落ちしちゃってるのだな…。
_spheres.py
残念ながら、見た目でほとんど変わらなかった。やっぱり遅い…。遅過ぎる…。
ということは、描画しようとしてるオブジェクトの種類に関係なく、とにかく大量に出した時点で遅くなるようだなと…。大量と言っても、この場合、30個程度なんだけどなあ。ファミコンですらスプライト64枚、MSXですら32枚だった(らしい)のに…。
オブジェクトの発生個数や座標計算のあたりはそのままにして、描画する個数のみを1〜3個にしてみたところ、滑らかに動いた。ということは…描画で処理落ちしちゃってるのだな…。
[ ツッコむ ]
以上です。