日本でハリウッドVFXを制作! 「経産省アイディアボックス」 結果:  
●まとめエントリはこちら ●FAQ ●お問い合わせは左のメールフォームから

2010年11月6日土曜日

MIMデザイン事務所の思い出 (その2)

今年の2月頃「MIMデザイン事務所の思い出」というエントリを書いたが、そのエントリに対して当時のMIMデザインを知るエバアンタレスさんよりコメントをいただいた。

懐かしさと共に、当時の状況を知る人とつながりが持てたことがとてもうれしくなり、しばしMIMデザインに関してググってみたところ、新たな情報をいくつか見つけた。

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

まず、みつけたのが高須孝氏のサイト「高須孝の手仕事BOOK
このプロファイルのページで、社長の三村建治氏とのつながりが書かれている。

ここで得た情報は、三村氏にはお兄さんがいらっしゃることと、そこにはエバ カーズという会社とのつながりがあるということ。
エバ カーズについてはまったくいままで聞いたこともなかったが、バックグラウンドを見るとその筋では有名なところらしい。
確認を取ったわけではありませんが、今回コメントをくださったエバアンタレスさんのハンドル名の元になったのかも知れませんね。


上記の高須孝氏のヒストリページに、MIMデザインでみたのゲーム筐体と、なんと私がMIMデザインで働いたときに作られていたMR2ベースのフェラーリF40の写真が!



さらに調べてみると、このMR2ベースのF40はEVA E20と言う名称だとわかった。
ここから検索して画像をいくつか見つけることができた。

MIMで働いていたときはガレージの一番奥にサーフェイスが吹かれただけのグレイの状態でおかれていた、ほぼ完成状態で、働き始めて数日後に型どり業者がきててきぱきとFRPで型どりをしていった。
FRPで型どりをするのに驚いたのもそうだが、できあがったクルマにここまでFRPを塗りたくるなど失敗がこわくてとてもまねできないと思った。

販売したのはエバのほうからで、当時これがMIMデザインの片隅でつくられていたのは、場所を貸していたか、片手間の協力だったのかもしれない。(ちなみにMIMデザインでは、当時、原寸スケールのコンセプトカーを作る作業があり、そちらがメインだった。)

その後のどうなったは知らず、外装パーツとして販売されたのだと思っていた。
そういえばクルマ雑誌で広告を見たかも知れないが、はっきりとは覚えていない。
今回見つけたいくつかのサイトを見るとコンプリートカーとして販売されたらしい。
横幅を少しつめたようなかわいらしいF40に仕上がっている。

生産台数2台で、完成度の高さ故にフェラーリ社から訴えられて型も潰されたという話も?
(これに関しては後ほど)
皮肉にも、本家F40よりも稀少なものになっている。


というのは、一台はこちら(abikobase)



そしてもう一台は、白兎さんという方が所有するこちら(HIGH-GEARed's)(2004年12月)

このサイトではこのクルマの細部に至る設計の良さが指摘されているが、エバという会社の由来や、開発に携わった人達を考えれば納得がいく。


-------------
しかしこの生産台数二台というのには少し疑問がある。
こちら(KOJI's Dialy
これと同じクルマと思われるものが、
ここここにも
1989年(平成1年)の優秀賞ということなので、ちょうどMIMデザインをあきらめ、広島で就職した時期と一致する。あの後すぐに販売されたらしい。
ボディーにポリカーボネイトを使用してあったとは。当時としてはかなり贅沢。


それからもう一台の写真はこちら(Terra2 Import

これらは、同一のクルマがペイントし直されただけの可能性もあるが少なくとも3台は存在していたように感じる。

とおもっていろいろ見ていたらサイト(公認仕様!?「EVA E20>フェラーリF40」 )にある書き込みが。

なるほど、3台製作されて1台は全損。納得です。
しかも訴えられたというのもデマっぽい。
結局は売れなかったので3台しか作られなかったという感じなのかも知れません。
どちらにしても稀少さにはかわりありません。


-------------
さて、三村建治氏、高須孝氏、そして三村氏のお兄さんである三村信昭氏は後に日本初のスーパーカー童夢-零を作り出すことになった。(三村建治氏はモノコックを設計)
いまは走れないらしいが、GT4でその走っている姿を見ることが出来る。

以下の動画は全く関係ないですが1970年のランチャー・ストラトス・ゼロ




当時からランチャはフェラーリのエンジンを使ってたんですね。

余談ですがもうストラスという名称はフェノメノン社が所有しておりランチャ社我使うことは出来ないんですよね。だからランチャ・ストラトスという名称のクルマはよほどのことがない限りもう作られることはないのかな。




童夢-零の生産台数は1台である。
参照HP: SUPERCAR NET「童夢」


有料動画だが、ニコニコチャンネルのMondo TVで
幻のスーパーカー「童夢-零」を追え!!」という番組があるらしい。
この中に三村氏が登場するのかどうかわからないが一度見てみたい。


デイリーポータルZでもおもしろい記事があった。
デイリーポータルZ:「CFRPでドカヘルを作る@童夢」

そういえば、MIMデザインでも当時はまだ最先端で珍しかったカーボンファイバーを使って作業する部分もあった。
会社だからこんなのも大量に買えるのかなと思うぐらいたくさんあったので、「カーボンファイバーって聞いてたほど高くないのかもな~」 などと思ったりもした。
実は、童夢の製作に関わった所だからこそ、その価値をよくわかっており、当時からカーボンファイバーを普通に使っていたのかも知れない。



-------------
そして、三村建治氏に関して書かれたWikipediaのページも見つけることができた。

前回は、「建治」ではなく「健治」でさがしていたので見つけることが出来なかったらしい。
しかしデザイナー以外の経歴もすごい,1970年代に20代でプライベートF1チームを組織し、プライベートコントラクターが海外のF1レースに参加したのは2010年現在、そのマキF1チームのみだと言う。
マキF1当時のデザインに関してはこちらに少し触れれている。
参照:M.D.O.R.C.「マキF101」


エバアンタレスさんから、ノスタルジックヒーロー誌で、三村建治氏の連載がのっていると教えて頂いたが、こちらもレースに関する物のようだ。

ノスタルジックヒーロー 2010年 08月号「連載・日本レース史の断章 三村建治[前半]」
ノスタルジックヒーロー 2010年 10月号「連載 日本レース史の断章 三村建治[後半]」


今にして思えば、そのような環境で育った三村氏は、自分のような普通の環境で育った人間には理解不能な部分があり、把握できなかった。
なんというか型にはまらないというか、限界をもうけないというか。
自分で自分の発想を否定しないというか。
当時は親の価値観からぬけだせていなかった自分には、非常識的な人間とも思えた。
(別に人に迷惑をかけるとか、不快にするとかという意味ではない)
今でもうまく表現できないが、なにか思いついたことを大切にし、そのままストレートに表現しようとするために力を使える人という感じ。
反面、子供っぽい熱意をみせることもあった。作っている物に関する興味はまるで子供がプラモデルを作っているかのような印象だった。

クリエイターなら誰でもそうなんだろうが、田舎の工業デザイン科を卒業したばかりの自分には、今までに見たことがないタイプだった。

今思えば、少しの間だが、それを肌で感じて影響を受けた部分もあるように思う。
そして、彼のクリエイターとしての人間性のすばらしさと共に、自分の限界はなんて小さいのだろうと思う。足下にも及ばない。

2010年11月2日火曜日

メモ:マルチ・パス・レンダリング

Tutorial: Multipass rendering in Maya and Mental Ray (CG Channel.com)

Mental rayのマルチパスレンダリング(pannnoki CG blog)

mayaのマルチパスレンダリング(mentalray) (K 遊輔 CG勉強中)

「流体」とは (お知らせ)

最初の「「流体」とは」のエントリを書いてから、もう10日近くがすぎてしまいましたが、決して忘れているわけでも、あきらめたわけでもありません。

実は「応力」を理解するのに思った以上に時間がかかっています。
説明が人によってまちまちで、なかなか統一した考えを導き出すことができないのが原因です。
いろいろな説明があり以下のような問題がありました。
1)専門用語など難しい言葉と数式で説明してある。
2)人によって使う言葉が違ったり意味が微妙に食い違っている。

読んでいるうちにますます混乱して、後戻りしたり、もっと簡潔な説明を探したりして、少しずつですが、混乱を徐々に解きほぐしています。
もう少しで、新しいエントリとしてまとめる事が出来そうですので、今しばらくお待ちください。

2010年10月29日金曜日

入門用プログラミング言語 2

以前このブログの「入門用プログラミング言語」(2010年6月6日)でいろいろな入門言語を紹介したがいくつか新しい物を見つけたので追加しておきたい。


-------------
プログラミン
-------------

プログラミン
「プログラミン」は、プログラムを通じて、 子どもたちに創ることの楽しさと、 方法論を提供することを目的とした、ウェブサイトです。(「プログラミンについて」より)

文部科学省が子供でもプログラミングの基本概念を理解できるように、作ったWebベースのソフトウエア。
以前紹介したScrachに似た感じだがもっと単純化されているように見える。

 


参照リンク
サイト:プログラミン作品ギャラリー
サイト:子どもだけにはもったいない!? ブラウザでカンタンにプログラミングできる『プログラミン』
サイト:今なら間に合う!?「プログラミン」で夏休みの自由研究
ブログ:SUGIMOTO Tatsuo 「プログラミン


-------------
MS Small Basic
-------------
マイクロソフトが公開しているBasic言語
Kidsコーナーにあるところからも子供でも理解出来るように単純化されていることがわかる。

以前Basicに触れたことがあるので、ひょっとしたら取っつきやすいかも知れない。
入門用といえどもゲームが作れたり、いろいろとできる事は多いようだ。


参照リンク
サイト:超簡単「Small Basic」でプログラミングを始めよう! 
サイト:日本語化担当者が語るSmall Basic活用術
サイト:超簡単プログラミング「MS Small Basic」が正式版で無料公開、サンデープログラミングにどうですか?


-------------
Kojo
-------------
 Scalaという言語を学ぶために作られており、Turtleグラフィックスを標準装備する入門言語
 残念ながら資料は英語のみ。



参照リンク
サイト:Scala言語を学ぶやさしいツール「Kojo」が無償公開

メモ:プログラムの基本,変数/関数/スコープを押さえよう (IT pro)

IT pro
第6回プログラムの基本,変数/関数/スコープを押さえよう
黒板の例がわかりやすい。
変数を「箱」ではなく、関連付けた情報のみだしのように説明しているのは好感がもてる。

第7回 関数の便利な仕組み,「引数」と「戻り値」を理解する

2010年10月28日木曜日

迷路作成を簡単にするためのMelスクリプト


仕事で迷路を作ることになったのですが、ちょうど良い機会と思いMelで作ってみることにしました。
といっても迷路を自動生成するアルゴリズムなど実装できる実力はないので、迷路を作る作業を助けてくれるヘルパーです。
(機能)
●支柱と壁を自動作成
●壁をランダムに配置。
●壁を全体に配置する機能
●後から自由に壁を付け足せる。

(入力値)
●高さ
●壁の幅
●迷路全体のサイズ(柱の数で指定)
●壁をX方向のみ配置
●壁をXとZ方向に配置
●上記においてランダムのモードが選択できる。
(制限)
●壁の厚みは入力不可。
●グリッド数で迷路のサイズを指定不可。

(説明)
[Place Pillars]というボタンをクリックすると指定したサイズ、方法で自動的に柱と壁を配置します。
壁がほしいところへ追加するには、柱を選択(複数選択可)し、[-Zwall (North)] [+Zwall (South)][-Xwall (left)][+Xwall (right)]のいずれかをクリックします。



結果的には一日かけてもまだエラーがあり、自宅作業で朝4時半までかけて完成させました。
結論から言うと、ここまで時間をかけただけの意味があるのかというと、個人的にはいろいろと学べましたが、企業的にはほとんどないかもしれません。
ただ、これから先迷路が変更になった場合は、簡単に作成できるという潜在的メリットはあります。
(今回勉強になったこと)
いろいろと新しいことを勉強しました。
1)move コマンドでpivotを移動する方法

2)同(move)コマンドの中で変数と文字列を組み合わせるために( )を使う方法
例) move 0 -2.5 0 ($wall[0]+".scalePivot") ($wall[0]+".rotatePivot") ;

3)If文で二つ以上の条件式を論理演算する方法

4)四捨五入のやり方(ランダムに1か0の値を得る為に使用、0.5を加算するのがポイント)
 $rand = floor(rand(0,1)+0.5);

5)$distが8のとき、float $wAdjust = ($dist+1)/2 では4になってしまう、これを補正するにはいくつかの方法がある。自分で思いついたのは、float $wAdjust = ($dist+1)*0.5;
Twitterで質問した所いくつかの方法があることを教えて頂いた。
(助けてくださった方々、大変ありがとうございました。)
質問用につくったのが float $int =(8+1)/2; という混乱を招きやすい奇妙な変数名を使っていた。
 そのためここでは変数名は$numと変更させて頂き紹介します。
基本的には右辺では整数計算がされ、代入時に浮動小数点になるらしく、Pythonなど他の言語でも同様のことが起きるということらしい。解決するには以下のようにする。
  float $num =(8+1)/2.0;
float $num =(8.0+1)/2;
  float $num =(float)(8+1)/2;
  float $num =float(8+1)/2;
 float $num =(8+1)/float(2);
このいずれかの方法で4.5が返ってくる。 ちなみにfloat()もしくは(float)を使う方法を「型キャスト」と呼ぶらしく、元々C言語で使われていた物らしい。

6)Xformでベクトル値から値を使うには
xform -ws -t $position.x $position.y $position.z -2.5; ではエラーになる。
xform -ws -t ($position.x) ($position.y) ($position.z -2.5); としなくてはいけない。

7)ラジオボタンを使ってみた。すっかり忘れていたが-valueフラグはないので、どのボタンを選択しているかは、-selectを使用する。
int $wWall = `radioButtonGrp -q -select withWall`;
8)トグルボタンも使ってみた。こちらは-valueでOK

9)出来るだけグローバル変数を使わないようにするために、それぞれのプロシージャー内でコントロールからの値を取得するようにした。

他に、できた柱と壁をグループ化したかったのだが、グローバル変数を使う必要もあり、今回は省略した。

{
if(`window -exists mazeBuildingHelper`)
deleteUI mazeBuildingHelper;
window -title "Maze Buliding Helper" -widthHeight 500 700 mazeBuildingHelper;
columnLayout;
//set distance betweern pillars
text -label "Disntace between pillars. (ie: 4 :Pillar is placed at each 5 unit.)";
intFieldGrp -numberOfFields 1 -label "distance" -value1 4 -extraLabel "Unit" -enable1 true distanceNum;
//set hight of the wall.
text -label "Hight of the wall. ";
intFieldGrp -numberOfFields 1 -label "hight" -value1 5 -extraLabel "Unit" hightNum;
//size of the Maze
text -label "Entire size of the Maze. (Number of pillars) ";
intFieldGrp -numberOfFields 2 -label "sizeX (pillars)" -value1 10 -value2 10 -extraLabel "sizeZ (pillars)" sizeNum;
//wall with pillars.
radioButtonGrp -numberOfRadioButtons 3 -label1 "Pillars only" -label2 "Pillars + wallX" -label3 "Pillars +WallX,Z" -select 3 withWall ;
// checkBox -label "with Wall" -value false withWall;
checkBox -label "randomize" -value true randomize;
// button
button -label "Place Pillars" -command "placePillars";
// individual wall placement.
text -label "----------------------------------------------------";
text -label "place a wall for pillar";
button -label "-Zwall (north)" -command "zWall1" zBtn1;
button -label "+Zwall (south)" -command "zWall2" zBtn2;
text -label" ";
button -label "-Xwall (left)" -command "xWall1" xBtn1;
button -label "+Xwall (right)" -command "xWall2" xBtn2;
text -label " ";
showWindow mazeBuildingHelper;
global proc zWall1() {
$name =`ls -sl`;
int $size = `size($name)`;
for($k=0; $k<$size; $k++) {
int $dist =`intFieldGrp -q -value1 distanceNum`;
int $hight =`intFieldGrp -q -value1 hightNum`;
float $adjust =($dist+1)/2.0;
select $name[$k];
vector $position =`xform -q -ws -t`;
$wall = `polyCube -w $dist -h $hight -d 1 -n wall`;
move 0 -2.5 0 ($wall[0]+".scalePivot") ($wall[0]+".rotatePivot");
rotate -r -y 90;
xform -ws -t ($position.x) ($position.y) ($position.z -$adjust);
select -r $name;
};
}
global proc zWall2() {
$name =`ls -sl`;
int $size = `size($name)`;
for($k=0; $k<$size; $k++) {
int $dist =`intFieldGrp -q -value1 distanceNum`;
int $hight =`intFieldGrp -q -value1 hightNum`;
float $adjust =($dist+1)/2.0;
select $name[$k];
vector $position =`xform -q -ws -t` ;
$wall = `polyCube -w $dist -h $hight -d 1 -n wall`;
move 0 -2.5 0 ($wall[0]+".scalePivot") ($wall[0]+".rotatePivot");
rotate -r -y 90;
xform -ws -t ($position.x) ($position.y) ($position.z +$adjust);
select -r $name;
};
}
global proc xWall1() {
$name =`ls -sl`;
int $size = `size($name)`;
for($k=0; $k<$size; $k++) {
int $dist =`intFieldGrp -q -value1 distanceNum`;
int $hight =`intFieldGrp -q -value1 hightNum`;
float $adjust =($dist+1)/2.0;
select $name[$k];
vector $position =`xform -q -ws -t`;
$wall = `polyCube -w $dist -h $hight -d 1 -n wall`;
move 0 -2.5 0 ($wall[0]+".scalePivot") ($wall[0]+".rotatePivot");
xform -ws -t ($position.x-$adjust) ($position.y) ($position.z);
select -r $name;
};
}
global proc xWall2() {
$name =`ls -sl`;
int $size = `size($name)`;
for($k=0; $k<$size; $k++) {
int $dist =`intFieldGrp -q -value1 distanceNum`;
int $hight =`intFieldGrp -q -value1 hightNum`;
float $adjust =($dist+1)/2.0;
select $name[$k];
vector $position =`xform -q -ws -t`;
$wall = `polyCube -w $dist -h $hight -d 1 -n wall`;
move 0 -2.5 0 ($wall[0]+".scalePivot") ($wall[0]+".rotatePivot");
xform -ws -t ($position.x+$adjust) ($position.y) ($position.z);
select $name;
};
}
//-------global proc "generate maze"-----------
global proc placePillars() {
int $dist =`intFieldGrp -q -value1 distanceNum`;
int $hight =`intFieldGrp -q -value1 hightNum`;
int $sizeX = `intFieldGrp -q -value1 sizeNum`;
int $sizeZ = `intFieldGrp -q -value2 sizeNum`;
int $wWall = `radioButtonGrp -q -select withWall`;
int $randOn = `checkBox -q -v randomize`;
for ($j=0; $j<$sizeZ; $j++) {
float $placeZ = $j*($dist+1);
float $adjust =($dist+1)/2.0;
float $wallPlaceZ = $placeZ-$adjust;
for ($i=0; $i<$sizeX; $i++) {
float $placeX = $i*($dist+1);
float $wallPlaceX = $placeX+$adjust;
//create a Pillar
$pillar = `polyCube -w 1 -h $hight -d 1 -n pillar` ;
move 0 -2.5 0 ($pillar[0]+".scalePivot") ($pillar[0]+".rotatePivot") ;
move -x $placeX -y 2.5 -z $placeZ;
select -cl;
//create a wall_X
if ((($wWall == 2)&&($i <$sizeX-1))||(($wWall == 3)&&($i <$sizeX-1))) {
$rand = floor(rand(0,1)+0.5);
if (($randOn == true)&&($rand ==1)){
$wall = `polyCube -w $dist -h $hight -d 1 -n wall` ;
move 0 -2.5 0 ($wall[0]+".scalePivot") ($wall[0]+".rotatePivot") ;
move -x $wallPlaceX -y 2.5 -z $placeZ;
select -cl;
} else if ($randOn == false) {
$wall = `polyCube -w $dist -h $hight -d 1 -n wall` ;
move 0 -2.5 0 ($wall[0]+".scalePivot") ($wall[0]+".rotatePivot") ;
move -x $wallPlaceX -y 2.5 -z $placeZ;
select -cl;
};
}; //end "if" Wall_X
//create a wall_Z
if (($wWall == 3)&&($j > 0)) {
$rand = floor(rand(0,1)+0.5);
if (($randOn == true)&&($rand ==1)){
// $wallPlaceX= $wallPlaceX -$adjust;
$wall = `polyCube -w $dist -h $hight -d 1 -n wall` ;
move 0 -2.5 0 ($wall[0]+".scalePivot") ($wall[0]+".rotatePivot") ;
rotate -r -y 90;
move -x ($wallPlaceX-$adjust) -y 2.5 -z $wallPlaceZ;
select -cl;
} else if ($randOn == false) {
$wall2 = `polyCube -w $dist -h $hight -d 1 -n wall` ;
move 0 -2.5 0 ($wall2[0]+".scalePivot") ($wall2[0]+".rotatePivot") ;
rotate -r -y 90;
move -x ($wallPlaceX-$adjust) -y 2.5 -z $wallPlaceZ;
select -cl;
};
}; //end "if" Wall_Z
}; //end "for" loop PlaceX
}; //end "for" loop PlaceZ
} // end global proc placePillars()
}