ラベル COLLADA の投稿を表示しています。 すべての投稿を表示
ラベル COLLADA の投稿を表示しています。 すべての投稿を表示

2009年9月21日月曜日

QC: Mesh ImporterでDAEファイルが読める.(kmzの中身もなんとかなったw)

追記(2009/9/22):画像をTwitpicからblogger(blogspot/picasa)サーバへ移動



Twitterに書いただけでこっちにメモってなかったw.

“でけた.モデルはこれ( http://bit.ly/13HGIo )とおなじ.情報: http://bit.ly/gsUSt

collada-domにはいってたのを調べるとあれこれパラメータがあったりするとダメっぽい.テクスチャありもなんかだめだったけどなにかファイル配置がいけなかったのかな?

こっちも.

“雪豹Preview: DAEのモデルをPreview内でぐりぐり動かせたw.http://twitter.com/p_g_/status/3818773753


ということで感想
“「Quartz ComposerでDAEファイルが読み込みたい」ってのをやらなくてよかったw.むしろkmzを/tmpで展開してその時のdaeファイルへのパス文字列を取り出すパッチとか便利かもなw.”

2009年8月1日土曜日

COLLADA DOMのViewer用のあれこれをCocoaで利用できないか?

あっちこっちのサンプルを引っ付け合わせてやってみた.
参考: 前回エントリー

1.とりあえずこんな感じのライブラリ周り.
Frameworksのツリー

Other Frameworks下のライブラリはcollada-domに入ってたり作ったりしたヤツ.
Cg.frameworkは前回エントリーでインストールしたヤツで/Library/Frameworksの下.
libz, libxml2は/usr/lib下.

LinkedとOtherの使い分け知らない.Linkedが静的でOhterが動的?

2.とりあえずこんな感じのコード.
MyView.h
#import <Cocoa/Cocoa.h>
#import <OpenGL/CGLRenderers.h>
#import <OpenGL/gl.h>
#import <OpenGL/glu.h>
#import "Crt/CrtRender.h"

@interface MyView : NSOpenGLView
{
NSTimer *timer;
}
@end


MyView.mm (拡張子はmm!)
#import "MyView.h"
@implementation MyView
CrtRender _CrtRender;
- (void) heartbeat
{
if(![[NSApplication sharedApplication] isHidden]){
[self setNeedsDisplay:YES];
}
}
- (id) initWithFrame: (NSRect) frame
{
NSOpenGLPixelFormatAttribute attribs [] = {
NSOpenGLPFADoubleBuffer,
NSOpenGLPFADepthSize, 24,
NSOpenGLPFAStencilSize, 8,
0
};
NSOpenGLPixelFormat *fmt;

{
fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes: attribs];
NSOpenGLContext *preflight = [[NSOpenGLContext alloc] initWithFormat:fmt shareContext:nil];
[preflight makeCurrentContext];
[fmt release];

const GLubyte* extensions = glGetString(GL_EXTENSIONS);
if ((GL_FALSE == gluCheckExtension((GLubyte *)"GL_ARB_shader_objects", extensions)) ||
(GL_FALSE == gluCheckExtension((GLubyte *)"GL_ARB_shading_language_100", extensions)) ||
(GL_FALSE == gluCheckExtension((GLubyte *)"GL_ARB_vertex_shader", extensions)) ||
(GL_FALSE == gluCheckExtension((GLubyte *)"GL_ARB_fragment_shader", extensions)))
{
attribs [3] = NSOpenGLPFARendererID;
attribs [4] = kCGLRendererGenericFloatID;
}
[preflight release];
}
fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes: attribs];
[super initWithFrame: frame pixelFormat: fmt];
[[super openGLContext] makeCurrentContext];
[fmt release];

return self;
}
- (void) dealloc
{
if (timer) {
[timer invalidate];
[timer release];
}
[super dealloc];
}
- (void) awakeFromNib
{
NSRect r= [self bounds];
GLsizei width= ((int) r.size.width);
GLsizei height= ((int) r.size.height);
_CrtRender.SetScreenWidth(width);
_CrtRender.SetScreenHeight(height);

_CrtRender.Init();
//_CrtRender.SetUsingVBOs( CrtTrue );
_CrtRender.SetUsingNormalMaps( CrtTrue );
_CrtRender.Load( "/Users/work/Documents/dominos.dae" );
_CrtRender.SetAnimationOn( CrtTrue );

timer = [NSTimer scheduledTimerWithTimeInterval: (1.0f/60.0f)
target: self
selector: @selector(heartbeat)
userInfo: nil
repeats: YES];
[timer retain];

[[NSRunLoop currentRunLoop] addTimer: timer forMode: NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] addTimer: timer forMode: NSEventTrackingRunLoopMode];

glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glClearColor(0.9f, 0.9f, 0.9f, 1.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glEnable( GL_CULL_FACE );
glCullFace( GL_BACK );
}
- (void) drawRect: (NSRect) rect
{
GLfloat width= rect.size.width;
GLfloat height= rect.size.height;
if (height == 0)
{
height= 1;
}
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
_CrtRender.SetScreenWidth(width);
_CrtRender.SetScreenHeight(height);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

if(_CrtRender.GetScene()) {
_CrtRender.Render();
}

[[self openGLContext] flushBuffer];
}
@end



3.とりあえずこんな感じの'ヘッダー検索'の設定.

(collada-domが/Users/work/Documents/で展開されたという前提)


4.とりあえずこんな感じのIB.
CustomViewを張ってMyViewに指定.
Autosizingも全部チェックしといて拡大縮小に対応しとくとよいかもw.


5.とりあえずこんな感じの結果.

オリジナルのViewrでの動画はこちら

2009年7月28日火曜日

COLLADA DOMのViewerを動かすまで

動機
拡張子がdaeのファイルを読み込んで描画できたらGoogle SketchUpで色々作って使えて便利そうだなぁ

環境
MacBook: Intel Core 2 Duo/NVIDIA GeForce 9400M, MacOSX: 10.5.7

1.Cg.frameworkのインストール
こちらここから'Cg Install Packages'/MacOSX用をdownloadしてインストール(Cg-2.2_April2009.dmg).
/Library/Frameworks/Cg.framework ができる

2.COLLADA Document Object Model (DOM)のViewer
2.1 ここからdownload(今回はcollada-dom-2.2.zip).
2.2 展開してできたフォルダを${COLLADA-DOM}とする
2.3 アーキテクチャの問題(?)対応 (こちら参照)
$ cd ${COLLADA-DOM}/dom
$ make
$ cp build/mac-1.4/libminizip.a external-libs/minizip/mac/libminizip.a

2.4 問題点をコメントアウト
$ cd ${COLLADA-DOM}/rt
$ vi src/Crt/CrtUtils.cpp (68行目'printf( str );'をコメントアウト '//printf( str );')

2.5 Xcodeで${COLLADA-DOM}/viewer/projects/xcode/viewer.xcodeprojを開く
2.6 ライブラリ検索パスを設定する

再帰を使って書くとこんな感じ
(bulletのライブラリだけ同名と衝突してしまうらしいので記述)
2.7 ビルド
2.8 ${COLLADA-DOM}/viewer/bin/viewer ができる.

3.Viwerを動かす
3.1 ターミナルにて
$ cd ${COLLADA-DOM}/viewer/bin
$ unzip samples.zip (unzipだとカレントフォルダにファイルができる)
$ ./viewer duck.dae


$ ./viewer mushroom.dae


4.SketchUpからexportしたkmzファイルに挑戦
4.1 Google SketchUp 6.0(6.4.245)にて
4.2 モデル作成
(ライブラリーより/ by Jack)
4.3 モデル出力(ファイル/書き出し/3D モデル…), Google Earth 4 (*.kmz)形式
4.4 出力したファイルの拡張子をkmzからzipに変更し, 展開.
4.5 展開後modelフォルダがあり,その中に*.daeファイルがある
4.6 作成したViewerをつかって表示してみる