頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


Blenderで作った3DのデータをSwiftでMetalに使いた〜い!

なんかタイトルがすイエんサーみたいだけど、まあタイトル通りなんだ。

今まではBlenderで作ったオブジェクトをWavefront(.obj)ってので出力、C++のコードで 〜.h/cってファイルを作成、そのファイルをXcodeで読み込んで、Objective-CのOpenGL ESで使っていたのよ。下のリンクの通りなんだけどね。

How To Export Blender Models to OpenGL ES: Part 1/3 - Ray Wenderlich

MetalフレームワークとSwiftで同じことをやってみようとしたんだけど、これがなかなかうまくいかなくてどうしたら正解なのかよくわからない。経過をシェアってことで。

その前に上記リンクにあるコードで作ったCの3Dのデータはこんな感じ。法線とテクスチャ座標は略。robot3の3はこちらの都合なので意味はないからスルーしてね。
//robot3.h

extern const int robot3Vertices;
extern const float robot3Positions[1980];


//robot3.c

#include "robot3.h”
const int robot3Vertices = 660;
const float robot3Positions[1980] = 
    {
        -0.437199, 0.539412, -0.437199, 
        -0.437199, -0.539412, -0.437199, 
        -0.437199, 0.494338, -0.139248, 
        (略)
    };
その1 ダイレクトにやってみる
最初は上のコードをそのまま読み込んで使おうとしたのよ。Swiftから読み込むためにプロジェクト名-Header.hってファイルに
#import "robot3.h"
としておく。この辺はSwiftとObjective-Cの相互利用とかで調べるといろいろわかると思う。

こんな感じで使おうとしたのよ。
{
    println("robot3Vertices = \(robot3Vertices)”)

    let positions = robot3Positions
    println("positions.0 = \(positions.0)")
    println("positions.1 = \(positions.1)")
    println("positions.2 = \(positions.2)")
}
結果スクショ

値を見ると確かに読み込めてる。
でもpositionsを使おうとしてもコンパイルエラー。

コンパイルエラーメッセージ

なに、このFloatの羅列は?

positionsの型を確認(option+クリックで表示されるよね)すると

タプルの型表示

なんじゃこりゃ?って最初は目が点になったけど、これタプルってやつだよね。Cの配列をSwiftで読み込もうとするとタプルになるってことか。

タプルへのアクセスは上のようにピリオドとインデックスでできるけど、問題はこのインデックスの部分に変数を使えないっぽいこと。

これじゃあ数千個もある各点をGPUへ渡すことができない、、、?


ってことでダイレクトにGPUに渡すのは無理っぽいのでひとひねりしようとしたんだけど、長くなったので次に。



<< Blenderで作った3DのデータをSwiftでMetalに使いた〜い2  TopPage  Objective-CのプロジェクトからSwiftのクラスを使う >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/947-4a4e1b6b




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad