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;

2010/05/20

Blender - シーンの自動生成(5) 横断歩道を作るの巻き

前回は壁とガードレールを新設、コーナーを丸く、単位をメートルとするあたりをやりました。今回は、横断歩道を作ります。さらに、横断歩道の部分はガードレールを作らないようにします。



出来上がりの図

20100520_1

20100520_2

テクスチャを作ってないので分かりづらいですが、テクスチャを貼るために横断歩道の部分だけ独立したポリゴンになっているのが分かるかと思います。ガードレールの途切れ具合もこんな感じかと。



ガードレール生成部分

「作る予定だったガードレールポリゴンのうち横断歩道の部分だけを消す」ということをするために、Python の区間演算ライブラリであるInterval moduleを使いました。これを使うと区間集合 list of (float, float) 同士の差分が計算できるので、ガードレール区間 - 横断歩道区間を計算してポリゴンを作るということをしています。



横断歩道生成部分

今度は「作る予定だった路面ポリゴンのうち、横断歩道部分に頂点を追加する」ということをしたいのですが、interval module だと連続した区間は1つにまとめられてしまうので、区間の和をとる感じではできませんでした。路面と横断歩道の頂点集合をソートしつつマージ。



TODO

なんといってもテクスチャですね。これがないと地味すぎます。なんすかこれ、業務用ポリゴンですかみたいな。テクスチャを作って、UV座標をセットして貼り付けるみたいなことをする予定です。

2010/04/21

Blender - シーンの自動生成(4)

ゲーム開発の方、しばらく放置してしまいましたが、道路メッシュができないと進まない!ということで久しぶりに進めることにしました。

前回は、踊り場の形をちゃんとしたり、坂を滑らかにしたりする所までやりました。



成功イメージ

今回はこんなです。

20100421_0

20100421_1



壁を作る

壁がないとすぐに車が落ちてしまうので、あった方がいいだろうということで作りました。

長い道路の両側すべてに作りこんだ店を配置するわけにもいかないので、ほとんどの部分はテクスチャでハリボテを作ってそれっぽく見せる、という用途にも使えます。

ちなみに、せっかく作った convex hull コードですが、要らないというかうまくいかない場合があると分かったので外しました。素直に「道路部分の延長」と「踊り場」のそれぞれについてポリゴンを作ったらうまくいきました。

重複頂点が出るので、Blender の "Remove Doubles" 機能を最後に呼んでいます。



ガードレールを作る

今までは床と壁が1個ずつでしたが、壁を1個増やして小さくしてガードレールとしました。原理はたいしたことないですが、今まで1個だったローカル変数とかを2つにするのが面倒。



四角いコーナーをまあるくする

前回ので少し走らせてみたところ、コーナーが丸くないと曲がるときすぐ壁にぶつかってイライラすることが分かったので、角を取ってみました。

コードの変更は少ないですが、なんかもうぐちゃぐちゃになりつつあって、さらに横断歩道の部分はガードレールなしにしたいとか思ったらどこを変えればいいんだろうって感じになってます。む~ん。



単位をあわせる

単位をメートルとする。...とても地味ですが重要なポイントです。

車の大きさ、道路の幅、ガードレールの高さ、建物の高さ等単位を揃えておかないと、なんかサイズ感が違ったオブジェクトが集まってどれを調整したらいいかわかんなくなってしまいます。

スクリーンショットでは、道路の幅は 8m, 歩道の幅は 3m, ガードレールの高さは 1.2m という設定になっています。



おまけ

壁とガードレールを取り付けた時点でのスクリーンショットが残っていたので貼りつけておきます。

20100312

20100312

20100312



次回

triangle mesh の上で車(raycast vehicle)を走らせると、ポリゴンの継ぎ目で車にとんでもない力がかかって横転してしまう、という大きな問題があったので、Bullet 界隈のフォーラムを調べて解決した、という話を書こうかと思います。

オフラインでは進んでたりするんですが、記事化するのが面倒で書いてないネタもいくつかあったりします。