Pythonスクリプトで法線を出力したけどうまくいかない

  • このフォーラムに新しいトピックを立てることはできません
  • このフォーラムではゲスト投稿が禁止されています

投稿ツリー



前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2009/5/2 10:13
mona2009  新米   投稿数: 7
初歩的な質問で申し訳ございません。
Pythonスクリプトで法線を出力したくて以下のようなスクリプト(某所からのパクリに法線出力を追加)を書いたのですが、

(前略)
     file = open(filename, 'wb')
     scn = Blender.Scene.GetCurrent()
     object = scn.objects.active
     if not object or object.type != 'Mesh':
          BPyMessages.Error_NoMeshActive()
          return
     mesh = object.getData(mesh=True)

     file.write("static GLfloat " + object.name + "_vertData[] = {\n")
     for face in mesh.faces:
          file.write("\t" + str(face.verts[0].co.x) + ", " + str(face.verts[0].co.y) + ", " + str(face.verts[0].co.z) + ", ")
          file.write(str(face.verts[1].co.x) + ", " + str(face.verts[1].co.y) + ", " + str(face.verts[1].co.z) + ", ")
          file.write(str(face.verts[2].co.x) + ", " + str(face.verts[2].co.y) + ", " + str(face.verts[2].co.z) + ",\n")
     file.write("};\n\n")

     file.write("static GLfloat " + object.name + "_normalData[] = {\n")
     for face in mesh.faces:
          file.write("\t" + str(face.no.x) + ", " + str(face.no.y) + ", " + str(face.no.z) + ",\n")     # 法線出力
     file.write("};\n\n")
(後略)

このスクリプトで新規作成時に表示されるCubeを三角形に分割して、頂点と法線を出力したら奇妙な法線が出力されます。

static GLfloat Cube_vertData[] = {
	1.0, 0.999999940395, -1.0, 1.0, -1.0, -1.0, -1.00000011921, -0.999999821186, -1.0,
	1.0, 0.999999940395, -1.0, -1.00000011921, -0.999999821186, -1.0, -0.999999642372, 1.00000035763, -1.0,
	1.00000047684, 0.999999463558, 1.0, 1.0, 0.999999940395, -1.0, -0.999999642372, 1.00000035763, -1.0,
	1.00000047684, 0.999999463558, 1.0, -0.999999642372, 1.00000035763, -1.0, -0.999999940395, 1.0, 1.0,
	-1.00000011921, -0.999999821186, -1.0, -1.00000035763, -0.999999642372, 1.0, -0.999999940395, 1.0, 1.0,
	-1.00000011921, -0.999999821186, -1.0, -0.999999940395, 1.0, 1.0, -0.999999642372, 1.00000035763, -1.0,
	1.0, -1.0, -1.0, 0.999999344349, -1.00000059605, 1.0, -1.00000011921, -0.999999821186, -1.0,
	0.999999344349, -1.00000059605, 1.0, -1.00000035763, -0.999999642372, 1.0, -1.00000011921, -0.999999821186, -1.0,
	1.0, 0.999999940395, -1.0, 1.00000047684, 0.999999463558, 1.0, 1.0, -1.0, -1.0,
	1.00000047684, 0.999999463558, 1.0, 0.999999344349, -1.00000059605, 1.0, 1.0, -1.0, -1.0,
	1.00000047684, 0.999999463558, 1.0, -0.999999940395, 1.0, 1.0, 0.999999344349, -1.00000059605, 1.0,
	-0.999999940395, 1.0, 1.0, -1.00000035763, -0.999999642372, 1.0, 0.999999344349, -1.00000059605, 1.0,
};

static GLfloat Cube_normalData[] = {
	0.0, 0.0, -1.0,
	0.0, -0.0, -1.0,
	2.08616299346e-07, 1.0, 2.38418536469e-07,
	2.68220873068e-07, 1.0, 1.78813976959e-07,
	-1.0, 2.08616299346e-07, -1.19209317972e-07,
	-1.0, 2.38418579102e-07, -1.49011583517e-07,
	-8.94069600577e-08, -1.0, -2.98023252299e-07,
	-4.76837215047e-07, -1.0, 8.94069032142e-08,
	1.0, 0.0, -2.38418579102e-07,
	1.0, -5.66244125366e-07, 3.27825375734e-07,
	-0.0, -0.0, 1.0,
	0.0, -0.0, 1.0,
};

頂点Cube_vertDataは特に問題ないのですが、法線Cube_normalDataに関しては異常な値が出力されます。
スクリプトの使い方が間違っているのでしょうか。

投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2009/5/2 10:33
uimac  常連   投稿数: 49
mona2009さんこんにちは。

例えば、2.08616299346e-07 は 2.08616299346 x 10のマイナス7乗なので
0.000000208… で、およそ0です。

Blender内部で単精度(Float)の値になっているので
10のマイナス6乗(1.0e-06)くらいまでは、だいたいあってます。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2009/5/2 12:31
mona2009  新米   投稿数: 7
早速のご返信ありがとうございます。

指数を考慮せずに早とちりしてしまいました。
確かに単精度ということを考えるとこんなものですね。

無駄な質問をしてしまいました。申し訳ございませんでした。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2009/5/12 21:07
mona2009  新米   投稿数: 7
補足です。

法線データをOpenGLで使うつもりだったので、頂点毎に法線を求めた方が良いと思われます。
こうするべきでした(三角ポリゴンの場合です)

    for face in mesh.faces:
         file.write("\t" + str(face.verts[0].no.x) + ", " + str(face.verts[0].no.y) + ", " + str(face.verts[0].no.z) + ", ")
         file.write(str(face.verts[1].no.x) + ", " + str(face.verts[1].no.y) + ", " + str(face.verts[1].no.z) + ", ")
         file.write(str(face.verts[2].no.x) + ", " + str(face.verts[2].no.y) + ", " + str(face.verts[2].no.z) + ",\n")
    file.write("};\n\n")

投票数:1 平均点:0.00

  条件検索へ


ログイン

ユーザ名:

パスワード:



パスワード紛失

クイックリンク

2021/07/01版
●Blender.org
BlenderFoundation
- Blenderのダウンロード
- 公式チュート等
- 公式マニュアル(和訳)

●ニュース(英文)
BlenderNation

●Blenderコミュニティ
blenderartists.org

●Blender Q&A
- Blender Stack Exchange

●テストビルド
Buildbot(自動生成)


●開発関連
公式開発サイト
Blender開発blog
Blender Wiki