mieki256's diary



2017/09/26(火) [n年前の日記]

#1 [pi3d][python][raspberrypi] pi3dでeggを使う際の注意点

pi3dで、複数のテクスチャ画像を使っているeggモデルデータを表示しようとすると、テクスチャが一枚分しか反映されなくて悩んでいたのだけど。

正常に描画される _pi3d_demos内の egg の中身を眺めているうちに、なんとなく原因が分かってきた。

ちゃんと表示されるeggデータは、どうもテクスチャ画像毎にポリゴン群をグループ化しているようで。例えば以下のような感じでデータが並んでる。
テクスチャAを使ってるグループ
  ポリゴン群データ
グループ終わり

テクスチャBを使ってるグループ
  ポリゴン群データ
グループ終わり

テクスチャCを使ってるグループ
  ポリゴン群データ
グループ終わり

対して、blender + YABEE でエクスポートした、テクスチャがちゃんと反映されないeggは、テクスチャ毎にグループ分けなんかしてなくて。
グループ
  このポリゴンはテクスチャC
  このポリゴンはテクスチャB
  このポリゴンはテクスチャC
  このポリゴンはテクスチャA
グループ終わり

Panda3D SDK の pview でプレビュー表示すると、後者のeggも描画されるので、おそらく Panda3D の eggフォーマットとしては後者もサポートされていてしかるべき、なのだろうと想像するのだけど。

ただ、pi3d の場合、OpenGL ES を利用するライブラリだから、テクスチャ画像毎に描画していかないと描画パフォーマンスが出ない等の理由で、あらかじめデータ側で、テクスチャ別の並びで整理整頓しておいてくれないと困る、てな事情でもあるのかもしれない。

でもまあ…。 ということで、今後 egg は使わない、というノリで触っていこうかなと。 *1

ちなみに、blender からエクスポートした obj + mtl は、マテリアル別=テクスチャ別にポリゴン群がまとまって並んでいるので、pi3d が egg に望んでる仕様 ―― テクスチャ別にグループ分けして並べろ、的な仕様は、obj + mtl の場合既に満たされている可能性が高い。 *2
*1: そもそも、不人気で死兆星が見えかけてる気配があるPanda3Dが独自に策定したフォーマットなんて、できれば触りたくないし。
*2: もっとも、blenderのエクスポータはテクスチャ別に並べているけど、他の3DCGソフトのエクスポータはそういう仕様になってない可能性があるので、obj + mtl ならとにかくOKというわけではなさそう。

#2 [pi3d][python][raspberrypi] pi3dで3Dモデルデータを描画

とりあえず、pi3d で 3Dモデルデータを描画できた。ような気がする。

以下は、Raspberry Pi Zero W + pi3d 2.21 で動作確認した際の様子。デジカメで撮影したから画質が汚いけど、動いてることぐらいは分かるかなと。



結構滑らかに動いてる。OpenGL ESってスゴイ。もっとも、画面が出てくるまで随分時間がかかってるけど…。そのあたりは Raspberry Pi Zero W だから仕方ない、のかな。

ソース。 :

ソースは以下。

_draw_model.py
_モデルデータ(models.zip)

モデルデータは解凍して、ソースに対して models/*.obj となるように置いてもらえれば。自作データだからライセンスはCC0ってことで。

u"""
pi3d draw model sample.

モデルデータ(.obj + .mtl or .egg)を描画してみるサンプル。
ESCキーで終了する。

Windows10 x64 + Python 2.7.12 32bit + pi3d 2.21
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import pi3d

# ウインドウ生成
display = pi3d.Display.create(frames_per_second=60)

# ライトを設定. position, color, ambientを指定
light = pi3d.Light(lightpos=(10.0, -10.0, -5.0),
                   lightcol=(1.0, 1.0, 1.0),
                   lightamb=(0.3, 0.3, 0.3),
                   is_point=False)

# シェーダを生成
shader = pi3d.Shader("uv_light")

# カメラ生成
camera = pi3d.Camera.instance()

# モデルデータを読み込み
# modelpath = "models/cube_quad_tex2.obj"
# modelpath = "models/robo_01.obj"
modelpath = "models/robo_02.obj"
# modelpath = "models/cube_quad_tex2.egg"
# modelpath = "models/robo_01.egg"
# modelpath = "models/robo_02.egg"
my_model = pi3d.Model(file_string=modelpath,
                      name="my_model",
                      rx=0, ry=0, rz=0,  # rotate
                      sx=1.0, sy=1.0, sz=1.0,  # scale
                      x=0.0, y=0.0, z=4.0  # position
                      )

# モデルのシェーダを設定
my_model.set_shader(shader)
# my_model.set_light(light)

# キーボード取得用クラスを生成
keys = pi3d.Keyboard()

# メインループ
while display.loop_running():
    camera.reset()

    # モデルを描画
    my_model.draw()

    # モデルを回転
    my_model.rotateIncX(0.25)
    my_model.rotateIncY(1.0)

    if keys.read() == 27:
        # ESCキーが押されたら終了
        keys.close()
        display.destroy()
        break

少し解説。 :

モデルデータの読み込みは、以下のような感じで指定するらしい。
my_model = pi3d.Model(file_string="モデルデータへのパス",
                      name="モデルのID(名前)",
                      rx=0, ry=0, rz=0,  # 回転角度
                      sx=1.0, sy=1.0, sz=1.0,  # 拡大縮小率
                      x=0.0, y=0.0, z=4.0  # 位置
                      )
name がよく分からないのだけど…適当な名前でいいのかな。おそらく name を使って他のモデルデータと区別したりするのだろうから、他と重ならない名前をつけとけばいいのではないかと。分からんけど。

モデルデータを描画する際にシェーダが必要になるようなので、シェーダの生成と、モデルデータへの割り当てをする。
shader = pi3d.Shader("uv_light")
my_model.set_shader(shader)
「uv_light」は、「テクスチャ(UV値)を使用 + 照明計算有り」てな処理をするシェーダを指定、ということじゃないかなと。

モデルデータには、カメラやライトも割り当てられるようだけど…。
light = pi3d.Light(lightpos=(10.0, -10.0, -5.0),
                   lightcol=(1.0, 1.0, 1.0),
                   lightamb=(0.3, 0.3, 0.3),
                   is_point=False)

# my_model.set_light(light)
今回試した範囲では、反映のされ方がよく分からなかったのでコメントアウトしてある。

ちなみに、lightpos がライトの位置 or 光線の向き。lightcol がライトの色。lightamb が環境光の色だか強さだか。is_point で、点光源か平行光源だかの指定ができるのだろうか。ホントかな。自信無し。 _pi3d Package - pi3d 2.21 documentation に説明があるので、英語が分かる人は読んでください…。

#3 [nitijyou] 日記をアップロード

気が付いたら、最後にアップロードしたのが2017/09/04だった…。ということでせっせとアップロード。

2017/09/25(月) [n年前の日記]

#1 [pi3d][python] pi3dでeggモデルデータを表示しようとしているけれど

どうもよく分からん…。ちなみに pi3d のバージョンは 2.21。Panda3D SDK のバージョンは 1.9.4。Windows10 x64上で動作確認。

ライトが分からん。 :

ライトの位置情報が何を示しているのかが分からん…。位置なのか、向きなのか…。

_pi3d Package - pi3d 2.21 documentation

eggのエクスポートが分からん。 :

blenderと _YABEE を使って、eggファイルをエクスポートして、pi3d で読み込んでみたけれど。2枚使ってるはずのテクスチャが1枚しか反映されない。うーん。eggのプレビュー表示ツール pview を使うと、反映されてる・描画されるのだけどなあ。何故 pi3d 上では反映されないのか。

pi3d は複数のテクスチャに対応してないんじゃないの、と思ったけど、pi3d_demos に含まれてる eggファイルは複数テクスチャを使ってるんだよな…。どうしてそっちは反映されるのだろう…。

obj2eggが分からん。 :

Panda3D SDK に同梱されてた obj2egg.exe を使って、obj から egg に変換・出力してみたけれど。得られた egg を pi3d で読み込もうとするとエラーが出る。そもそも出力された egg の中にテクスチャ情報が含まれていない。形状は表示はされるものの、テクスチャは何も反映されてなくて真っ白なモデルが描画される。うーん。

2006年頃のやり取りでは、「Panda3Dに同梱の obj2egg は mtl(マテリアル情報)やテクスチャには対応してないぜ」という話が出てる。

_Panda3D - View topic - obj no texture

すると、Panda3D をお使いの皆さんは、一体どうやってeggファイルを作っているんだ? objファイル以外を経由して変換してるってこと?

_Models and Actors - Panda3D Manual

「Panda3Dの開発者はMaya使ってるからそれ以外は知らねえ」みたいなことが書かれてるな…。Mayaってどのくらいの価格なんだろう、とググってみたら1年契約で22万円。Panda3Dの開発陣って…金持ちじゃのう…。

x2eggも分からん。 :

blender から .x でエクスポートして、その .x を x2egg で egg に変換してみたけれど。pview で表示するとちゃんと表示されてるのに、pi3d で読みこんで表示するとポリゴンの表裏が反転してしまう。また、相変わらずテクスチャは1枚しか反映されず。

ちなみに、x2egg のヘルプは x2egg -h で表示できるっぽい。

そもそもobjでもいいんだけど。 :

まあ、pi3d は obj + mtl も読み込めるし、それならテクスチャが2枚とも反映されてるので、無理して egg を使わなくても obj を読ませればいいじゃないか、という気もしているのだけど。パンが無いならお菓子を食べればいいじゃない。

前述の、Panda3Dのフォーラムでも、「objを読み込ませればいいじゃん」みたいなことを言われてるし。しかし、すると、何のために egg形式を作ったのやら。他のモデルデータ形式では何か問題があるから、新規にモデルデータフォーマットを考え出したのとちゃうんか…。もしかしてアニメーション関係かな。obj + mtl ではアニメーション情報を含めることができないし。

#2 [nitijyou] 市の健康診断に行ってきた

10:00に出発。10:47頃終了。

いつもは暑い時期に受けてた印象があるのけど。今年は1ヶ月ぐらい遅い時期になってた気がする。その代わり、別の場所が今年は早い時期になってたけれど。どういう事情があるのだろう。実は毎年、時期を微妙にシャッフル、でもしてるのかな。

毎回思うけど、採血はどうにかならんのかな…。21世紀になったのだから、無痛の採血手法が発明されてもよさそうな…。人類の科学はまだまだ全然進歩が足りてない。

2017/09/24() [n年前の日記]

#1 [python] Panda3Dをインストール

.eggファイル関係について調べるために、Panda3D SDK をインストールしてみたり。ちなみに環境は Windows10 x64。

_Panda3D - Free 3D Game Engine
_Panda3D - Downloads
_Panda3D Software Downloads

インストール手順。 :

現行版は 1.9.4 らしい。Panda3D SDK 1.9.4 をクリックして辿りつつ、Panda3D-SDK-1.9.4.exe をDL。

また、.eggファイルのサンプルがたくさん入ってる art-gallery.zip も一応DL。

Panda3D-SDK-1.9.4.exe を実行。任意のフォルダにインストール。

インストールするコンポーネントを選択できるので、3ds Max plug-ins と Maya plug-ins のオプションは外した。

途中で、「この環境、Python 2.7 が既にインストールされてるんだけど…そのPythonからもPanda3Dライブラリを利用できるようにしてみる? やめとく?」てなダイアログが表示された。一応「はい」を選んでみたら、
Python2.7インストールフォルダ\Lib\site-packages\panda.pth
というファイルが作られた。中には Panda3D へのパスが書かれている。これで、OSにインストールされている Python 2.7 から Panda3Dが使えるようになったらしい。

また、インストールが終了すると、ユーザー環境変数の PATH に、以下が追加された。
Panda3Dインストールフォルダ\python
Panda3Dインストールフォルダ\python\Scripts
Panda3Dインストールフォルダ\bin
これで、DOS窓からPanda3D関係のツールをいきなり呼び出せるようになった。

サンプルの動作確認。 :

Panda3Dインストールフォルダ\samples\ 以下にサンプルが入っているので動作確認ができる。

Panda3D には python と名前が衝突しないように、リネームした ppython.exe が入っていて、ソレを使うと Panda3Dが動かせる。例えば 〜\samples\infinite-tunnel\ に入って ppython main.py を実行すると、トンネルが表示された。

eggへの変換ツールについて。 :

Panda3Dインストールフォルダ\bin\ 以下には、他の3Dモデルデータファイルを .eggファイルに変換するツールも入ってる模様。
dae2egg.exe
dxf2egg.exe
flt2egg.exe
lwo2egg.exe
obj2egg.exe
vrml2egg.exe
x2egg.exe
ツール名から想像するに、dae、lwo、obj、x 等から .egg に変換できるのだろう…。試してないから本当に変換できるのか分からんけど。

eggファイルビューワを実行。 :

Panda3Dインストールフォルダ\bin\ 以下の pview.exe を使うと、Panda3Dのモデルデータ形式である、.egg ファイルのプレビュー表示ができる。

_Previewing 3D Models in Pview - Panda3D Manual

pview hoge.egg てな感じで実行できる。

操作は、マウスの左ボタンドラッグで平行移動。中ボタンドラッグで回転。右ボタンドラッグでズーム変更。他にもショートカットキーが色々あるらしい。例えば w を叩くとワイヤーフレーム表示になったりとか。

eggファイルのサンプル。 :

art-gallery.zip を解凍すると、中に色々な .zip が入ってる。解凍すると .egg とテクスチャ画像が入ってるので、Panda3D SDK に入ってる pview を使ってプレビュー表示できる。

それはともかく。art-gallery.zip の中には、どうも著作権的にアウトっぽいモデルデータがチラチラと…。いいのかコレ。まあ、ローカルでの実験に使うだけなら…てなノリなのかな…。

以上、3 日分です。

過去ログ表示

Prev - 2017/10 -
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project