2011/10/02

Xcode でシェーダーをコンパイルさせないようにする

シェーダーがコンパイルされてしまう

OpenGL ES のプログラマブルシェーダーはアプリ実行時にコンパイルされるものなので、アプリビルドの際は何もせずにファイルとしてパッケージングしたいわけですが、Xcode 4.0.2 で拡張子が .vsh や .fsh のシェーダーファイルを追加してアプリをビルドするとシェーダーまでコンパイルされてしまい、シェーダーの独自構文が Objective C コンパイラで通らなくてビルドエラーになったりします。



Xcode 4.0.2 でシェーダーをコンパイルしないようにする方法

  1. 左側ペインのProject navigatorでプロジェクトを選択
  2. 右側ペインの左側部分でTARGETSを選択
  3. 右側ペインの右側部分で Build Phases タブを選択
  4. Compile Sources を開くとシェーダーファイルが表示されるので、ドラッグ&ドロップでCopy Bundle Resources のところに移動


スクリーンショット


2011/09/23

Blender 2.5 をコマンドラインツールとして使う

Blender をコマンドラインツールとして使う

以下のようにすると Blender をコマンドラインから起動して指定した Python スクリプトを実行することができます。

$ blender --background --python test.py

--background オプションを付けると Blender の UI を出さないモードで起動します。 コマンドラインツールとして大量のレンダリングを実行したり、モデルを自動生成するのに使えます。

blender コマンドにはパスを通すなどしてシェルから実行できるようにしておく必要があります。当方では以下のように alias を設定しています。

alias blender='/Applications/blender-2.59-OSX_10.5_i386/blender.app/Contents/MacOS/blender'


視点をスクリプトから設定したい

で、当方ではモデルを自動生成するのに使っているんですが、その blend ファイルを開いて確認する際、毎回決まった視点で表示したいと思ったので調べました。以下のようなスクリプトで設定できます。(ついでにテクスチャ付きで描画するようにしてあります)

# -*- coding: utf-8 -*-

import bpy
from mathutils import Quaternion


for a in bpy.context.window.screen.areas:
    for s in a.spaces:
        if s.type == "VIEW_3D":
            # テクスチャ付きで描画する設定
            s.viewport_shade = "TEXTURED"
            
            # ビューの設定
            s.region_3d.view_rotation = Quaternion((1,0,0),-1.57)
            s.region_3d.view_distance = 5
# 保存
bpy.ops.wm.save_as_mainfile(filepath="sample.blend", relative_remap=True)

Quaternion を使ってビューを設定します。
Blender の座標系は右手系なので、Quaternion((1,0,0), -1.57) は「X軸の方向を向いて反時計回りに-90度の回転」を表します。

何も回転しないと「X 軸が右、Y 軸が上、 Z 軸が手前」のビューになるので、上記の回転を施すと「X 軸が右、Y 軸が手前、Z 軸が下」になります。



スクリーンショット
生成された sample.blend を開いたところです。確かに X 軸が右、Y 軸が手前、Z 軸が下になっています。

2011/02/13

Bullet - strange collision of TriangleMesh

しばらくブログを更新しない間に SIO2 が v1.4 -> v2.0 になったりしているようです。
今日は Bullet の不具合?回避のネタです。

TriangleMesh の道路だと引っくり返る

SIO2 ゲームエンジンは物理エンジンとして Bullet を使っています。
で、Vehicle を TriangleMesh 製の道路上で走らせてみたところ、Triangle の境界で急に車体がひっくり返ってしまい、ゲームにならない!ということがあって困っていました。

で、調べたところ、こんなスレがありました。
http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=&f=9&t=3052

そこに載っている NotifyOnCollision 関数を定義して、


gContactAddedCallback = NotifyOnCollision;


を初期化時に実行するようにしたところ、解決。

gContactAddedCallback というのは bullet で定義されているシンボルで、以下の extern 宣言をすれば参照できます。


extern ContactAddedCallback gContactAddedCallback;