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

2010/02/01

AVATAR見てきた

1/30(土)に三宮のOSシネマでAVATAR見てきた。もちろん3D版。ただし吹き替えだったけど。

ネットですげーすげー言ってる声が多く、すごく気になっていたのでついに見に行ってしまいました。確かに、凄かった。

「観るのではない。そこにいるのだ」
というコピーだけども、まさにそんな感じ。ド派手な立体感ではなく、自然な存在感を演出するために3Dが使われている、という感じ。
まぁ一緒に行った友人はもっと色々飛び出してくるものだと思ってたみたいだけど、そういう映画では無かったです。上品な使われ方がされていました。

ストーリーはここでは別に書きませんが、結構楽しめました。

3D方式はXpanDというやつで少し画面が暗いかなぁという感じはしたけども、そこまで気になる感じでは無かったです。
何個かある3D方式の中でIMAXという方式が一番良いらしく、もの凄く綺麗らしいんですが、この辺りだと箕面まで行かないといけません...ちょっと遠い;;;(IMAXシアターは大阪, 愛知, 神奈川, 埼玉の全国に4カ所しかないらしいです。)
でも見てみたいなぁ。IMAXバージョン。また行ってみようかな...

2009/09/01

3D遊び

非常に簡単なプログラムです。
一応マウス位置のはデカくなるというインタラクション付きです。
ソースコードは以下。
int l=50;
int num;
Qube[] qube;

void setup(){
  size(800,500,OPENGL);
  //smooth();
  frameRate(30);
  colorMode(HSB,100);
  float x=l;
  float y=l;
  for(; x<width; x+=l){
    for(; y<height; y+=l) ;
  }
  num = int(x*y);
  
  qube = new Qube[num];
  for(int i=0; i<num; i++){
    qube[i] = new Qube(l,l,l); 
  }
}

void draw(){
  background(99);
  lights();
  directionalLight(99,0,99,0,0,-1);

  int count=0;
  for(float x=l; x<width; x+=l){
    for(float y=l; y<height; y+=l){
      pushMatrix();
      translate(x,y);
      rotateX(frameCount*PI/60 + x);
      rotateY(frameCount*PI/60 + y);
      float h = map(x,0,width,0,100);
      float s = map(y,0,height,0,100);
      float b = 99;
      fill(h,s,99,60);
      noStroke();
      qube[count].getDistance(x,y);
      qube[count].changeSize();
      qube[count].display();
      count++;
      popMatrix();
    }
  }
}
class Qube{
  int XL;
  int YL;
  int ZL;
  float xl;
  float yl;
  float zl;
  
  float range = 200;
  float distance=0;
  
  boolean isOver = false;
  
  Qube(){ }
  Qube(int XL, int YL, int ZL){
    this.XL = XL;
    this.YL = YL;
    this.ZL = ZL; 
  }
  
  void display(){
    box(xl,yl,zl);
  }
  
  void getDistance(float x,float y){
    distance=sqrt(sq(mouseX-x)+sq(mouseY-y));
    if(distance<range) isOver=true;
    else isOver=false; 
  }
  
  void changeSize(){
    if(isOver){
      float s=1;
      xl=XL+(range-distance)*s;
      yl=YL+(range-distance)*s;
      zl=ZL+(range-distance)*s;
    }else{
      xl=XL;
      yl=YL;
      zl=ZL;
    }
  }
}

2009/08/19

ProcessingでGlow表現

Glow表現ってやっぱり華やかだし、それがあるだけでカッコよく見える。
今回はOpenGLを使ってGlow表現を試してみました。
参考にしたのはこのサイト。

スクリーンショットだと分かりにくいですが、星と煙(?)はガクガク揺れてます。
Z方向にバウンドする壁を設けていないので、時間が経つと↑こんな感じになります。
少しいじるとビジュアライザに応用できそう・・・

flight404は正方形を作ってそこにテクスチャとして画像を貼付けているようですが、僕は手抜きをしてProcessingにもとから付いてるimage()メソッドを使いました。

ソースコードは以下。何も考えずに書いていったので綺麗じゃないかもしれませんが・・・
ここからzipファイルをダウンロードできます。こっちは画像が入ってます。)



/***********************************
 *
 * Opengl_glow.pde
 *
 ***********************************/

int STARS_NUM = 200;
int CORONA_NUM = 100;
float GRAVITY = 0.1;
float MAX_VELOCITY = 5;

Star[] stars = new Star[STARS_NUM];
Corona[] coronas = new Corona[CORONA_NUM];

void setup(){
  size(800,400,OPENGL);
  hint( ENABLE_OPENGL_4X_SMOOTH );
  background(0);

  PImage coronaImg=loadImage("corona.png");
  for(int i=0; i<CORONA_NUM; i++){
    float w=random(20,200);
    float h=w;
    Point pos = new Point(random(0+w,width-w), random(0+h,height-h));
    PVector vel = new PVector(random(-2,2), random(-2,2));
    coronas[i] = new Corona(coronaImg,pos,vel,w,h); 
  }

  PImage starImg = loadImage("star.png");
  for(int i=0; i<STARS_NUM; i++){
    float w=random(1,30);
    if(i%23==0) w=random(70,100);
    float h=w;
    Point pos = new Point(random(0+w,width-w), random(0+h,height-h));
    PVector vel = new PVector(random(-6,6), random(-6,6));
    stars[i]=new Star(starImg,pos,vel,w,h);
  }
}

void draw(){
  newFrame();
  glUtil();
  for(int i=0;i<CORONA_NUM; i++){
    coronas[i].move();
    coronas[i].bounce();
    coronas[i].display();
  }
  for(int i=0; i<STARS_NUM; i++){
    stars[i].move();
    stars[i].bounce();
    stars[i].display();
  }
}

void newFrame(){
  background(0,20);
}

/***********************************
 *
 * Point.pde
 *
 ***********************************/

class Point{
  float x;
  float y;
  float z;
  
  Point(){ }
  Point(float x,float y){
    this.x = x;
    this.y = y;
  }
  Point(float x,float y,float z){
    this(x,y);
    this.z = z;
  }
}
/***********************************
 *
 * Star.pde
 *
 ***********************************/

class Star{
  PImage starImg;
  
  Point pos = new Point();
  PVector vel = new PVector();
  
  float w;
  float h;
  
  Star(){ }
  Star(PImage starImg,Point pos,PVector vel,float w,float h){
    this.starImg=starImg;
    this.pos = pos;
    this.vel = vel;
    this.w = w;
    this.h = h;
  }
  
  void display(){
    pushMatrix();
    translate(0,0,pos.z);
    image(starImg,pos.x-w/2,pos.y-h/2,w,h);
    popMatrix();
  }
  
  void move(){
    pos.x+=random(-5,5);
    pos.y+=random(-5,5);
    pos.z+=random(-10,10);
  }
  
  void bounce(){
    if(pos.x+w/2>width || pos.x-w/2<0){
      vel.x*= -1;
      if(pos.x+w/2>width) pos.x=width-w/2;
      else pos.x=w/2;
    } 
    if(pos.y+h/2>height || pos.y-h/2<0){
      vel.y*= -1;
      if(pos.y+h/2>height) pos.y=height-h/2;
      else pos.y=h/2;
    }
  }
}
/***********************************
 *
 * Corona.pde
 *
 ***********************************/

class Corona extends Star{
  
  PImage coronaImg;

  Corona(){ }
  Corona(PImage coronaImg, Point pos, PVector vel, float w, float h){
    super(coronaImg, pos, vel, w, h);
  }
}
/***********************************
 *
 * Util.pde
 *
 ***********************************/

import processing.opengl.*;
import javax.media.opengl.*;


PGraphicsOpenGL pgl;
GL gl;

protected void glUtil() {
 pgl = (PGraphicsOpenGL) g;
 //gl = pgl.gl;
 //pgl.beginGL();
        gl=pgl.beginGL();
 gl.glDisable(GL.GL_DEPTH_TEST); // This fixes the overlap issue
 gl.glEnable(GL.GL_BLEND);// Turn on the blend mode
 gl.glBlendFunc(GL.GL_SRC_ALPHA,GL.GL_ONE); // Define the blend mode
 pgl.endGL();
}

public void capture(char str) {
 if(keyPressed && key == str) {
  saveFrame("data/img-####.png");
  
 }
} 

public void vertex(PVector p) {
 vertex(p.x, p.y, p.z);
}
/** Utility for PVector class
@param c1 control 1 of PVector class
@param c2 control 2 of PVector class
@param p point of PVector class
*/
public void bezierVertex(PVector c1, PVector c2, PVector p) {
 bezierVertex(c1.x, c1.y, c1.z, c2.x, c2.y, c2.z, p.x, p.y, p.z);
}
public void curveVertex(PVector p) {
 curveVertex(p.x, p.y, p.z);
}

2009/01/21

school of Dolphin

あ、気づいたら10日くらい更新してない!

新しい作品です。
その名も「school of Dolphin」
「イルカの学校」ではないですよ。「イルカの群れ」。

音無しバージョン

イルカ単体

これはBlenderのparticleのboids systemで作りました。
boidsっていうのはbirdsの方言だそうです。
要するにに鳥の群れをシミュレーションするためにつくられたようなもんらしいです。
これは他の生物にももちろん使えて、例えば魚とかイルカとか。
3D的な群れを形成するものだけでなく、サーフェイス面を歩く2D的なものの作成にも使えます。だから、蟻とか群衆とかにも使えるのかな。

本当はもっと綺麗な映像なはずなんですよね。
でもiMovieで音付けてから出力するときになぜか全体的に白っぽくなってもうた・・・

2009/01/10

初めてのFluidシミュレーション

物理シミュレーションBlender』を読みながら試してみたFluidシミュレーションです。

Blender触るの久しぶりですが、なんとか初めてFluidシミュレーションを使うことができました。
凄いなBlenderって。
ちゃんと流体に見える。
レンダリングには結構時間がかかりましたけど。

2008/11/21

Structure Synth



Structure SynthでBinary Kiteというサンプルをsunflowというレンダリングソフト用にエクスポートし、sunflowでレンダリングしてみました。
sunflowの使い方がよくわからなかったのと、エクスポートのときエラーが出まくったので少し手間取りましたが、なんとかレンダリング完了。
上の画像がStructure Synthでレンダリングしたやつで、下がsunflow。
色が抜けちゃってます。

カメラの位置がめっちゃ変なとこにあったので、それを修正するのも手間取りました。

本当はPOV-Rayにエクスポートしたかったんですけどね。
POV-RayってMac用の動かないんですよ。intel Macに対応してないのかな。

----------------------------------------------

ここをクリックして下さい。お願いします。

2008/11/12

POV-Ray





今日は学校のCGの授業での課題の作品として作ったものを貼ります。

CGの授業ではPOV-Rayをやっています。
最初は変数も使えないし、いちいち全部の座標などの数値を手入力しなきゃいけないしで「POV-Rayほんまダルい!!!」って感じでしたが、今はPOV-Rayでも変数とか関数とか使えると最近知ったのでちょっとPOV-Ray好きになりました。

課題の内容が、「中空のサイコロを使った作品」で、CSGを使えというものです。
「別にサイコロが主役でなくてもよい」とあったのですが、思いっきりサイコロ主役です。
というかサイコロって意識させないように作りました。

上が提出するもの、下はその旧バージョンです。
----------------------------------------------

ここをクリックして下さい。お願いします。