2008年9月21日日曜日

もっとクネクネさせてみた

2008年9月18日木曜日

くねくねさせてみた。

video

2008年9月11日木曜日

リンも作ってみた

ミクを改造して、リンも作ってみた。



ミクとリンで謎のシーン。

2008年9月8日月曜日

2008年7月27日日曜日

肌の色

人間は肌の色には敏感です。
顔色が悪い、っていう状態は単純に顔の毛細血管でちょっとだけ動脈流が滞っているってだけのことですからね。それでも、人間は肌の色で状態を検知できちゃうわけです。
なので、CGでリアルな画像を作ろうとしても、肌の色がちょっと違うだけで「何か変!」と感じてしまうわけです。

リアルじゃない画像でも同じように「何か変!」があります。



これは、普通にシェーディングしたものです。
顔色悪いですね。

手書きのイラストで色を塗るときなどと、影の付け方が違ってます。
作成は、Metasequoia でモデリングし、Keynote でポーズ付け、Warabi でレンダリングしたものです。

昔のゲームの色塗りはこんな感じですね。
プレステ1や2などでも、顔が黒ずんで見えるわけです。
TVMLプレーヤーもそうですね。

そこで、ちょっと変えてみたのがこれ↓です。



どうですか。
これは肌だけ、別のシェーダーを使ったものです。
他は暗くなるにしたがってだんだん黒に近づいていくのに対し、肌だけだんだん茶色に近づいていくようになってます。
これは、アニメの色塗りでは当たり前に行っているものです。
もちろん、アニメの色塗りでは、スムースシェーディングは使わないんですけど。

Warabiの設定は、こんな感じです。

2008年7月19日土曜日

Google Sketchup でいろいろ

Google Sketchup サクサクと何も考えずに作れます。
適当にいじっていたら、こんなんなりました。



問題は寸法が適当で正確な値が入れられないんですよ。
ヘルプを見ると数値入力もできるように書いてあるんですが、説明のとおりに数値を入力して Enter キーを押しても、ンーともスンとも言わない。
何か間違ってるのかなぁ・・・・。

よー、わからん。

で、メタセコに持っていってレンダリングなんですが、それだけじゃ寂しいので真ん中に素体ちゃん1号(セーラー服版)を配置。



せっかく打ちっぱなしコンクリートのマテリアルで作っても、もっていけないから、白い。

2008年7月16日水曜日

Google Sketchup でTVMLモデルを作る

Google が出している3Dモデルソフト Google Sketchup ですが、これはかなり変わったモデラーです。使い勝手はなかなか不思議な操作なのですが、慣れると建築物を作るにかなり効率がよいようです。
しかし、フリー版のSketchup は Google earth 形式のファイルでしか保存できません。
ところがところが、なぜかプラグインをサポートしていて、そのプラグインで obj ファイルを吐き出せます。なんと太っ腹な・・・・。

ということで、さっそく作ってみました。



作成時間30分くらい。

objファイル出力プラグインはここ

で、さっそくTVML2Player で表示してみる。



とりあえず、なんかでた。

しかしこれ、なぜかマテリアルファイル(.mtl)を作ってくれません。
せっかく壁をペタペタ塗ってもまったく意味がありません。
TVML2Player は、.mtl ファイルのない .obj ファイルだと、なんとフリーズします。
しょうがないので、いったんメタセコに読ませて、マテリアルを塗って再度.objに出力したのでした。

ふ~む。

2008年7月13日日曜日

髪の毛テクスチャ

3Dモデルを作っていたら、どうしても避けれないのが髪の毛のテクスチャ。
なんか、専用の「髪の毛テクスチャメーカー」とかあるんですが、どうも気に入ったテクスチャにならない。

どうしようかなぁと思って、PhotoShop Elements を触っていたら、なんか使えそうな機能を見つけました。

フィルタのなかに、ファイバーというのがあって、これのダイアログの値を調整すると、髪の毛っぽいテクスチャが作れるようです。



こんな感じ。

さて、髪の毛テクスチャには、つやつやした部分が必要です。
これがあるとなしとでは大違い。俗に言う「天使の輪」って奴ですね。
どうも、いろいろと調べてみると、この天使の輪は2つあるみたいです。



光源から直接当たる頭頂部の輪と、いろんな物体から跳ね返って当たる間接光による側面の輪です。
これらを、テクスチャの上に適当に載せ、あと暗いところも書き加えると、完成です。
レイヤーを分けて、ぼかし機能でぼやっとしたものを載せたのが↓これです。



まぁ、それっぽく出来たかなと。

2008年7月10日木曜日

四角いミクを動画にしてみた。

動画にしてみた。
video

以前、「窓録」という便利なキャプチャーソフトを使ってたんですが、交換したグラボ(Nvidia)との相性が悪いっぽくて、全滅。
いいのが無いかなと思っていたら、外国産にイイのがありました。これ↓。




しかも、ちゃんと日本語化してくれている人もいます。感謝感謝!。

http://nonn-et-twk.net/twk/CamStudio/

なかなかいい感じでキャプチャできました。
※保存ディレクトリに日本語のパスがあると、ちゃんと swf に変換してくれない程度は無問題です!

あと、音入力が起動時かってにマイクにされてしまうのはなぜだろう?


・・・・・アップしてみて驚いた。
なんという汚さ、ひどすぎる。Blogger恐るべし。トホホ。

ネギだ!

5分で作ったネギ。



それにしても、角い!

次は、これを振らせるわけだ。

2008年7月9日水曜日

動かしてみた



何しゃべらせようかなぁ・・・

何するにも、セットが必要だ。
それと小道具。

次はネギか・・・。

それにしても、顔色悪いなぁ。

2008年7月8日火曜日

「初音ミク」作ってみた

TVML用キャラとして、初音ミクを作ってみた。

こんなの。



ちょっと、角いかも。

2008年7月5日土曜日

TVMLの便利ツール

TVMLの番組を作るとき、結局うまくいかなくて、スクリプトをちょっと変更しては実行、の繰り返しになる。
そんなとき、いつも困るのが、長い番組であればあるほど、既に修正する必要がなくなったところを、何回も見る羽目になること。

そのためにTVMLには、skipscript コマンドがあるわけですが、いちいち付け加えるのは面倒。

そこで、こんなツールを作ってみました。
実行したいところだけを、ドラッグして反転させて、[Play Selection]ボタンをクリック。
するとどうでしょう。
あらあら不思議、反転させたコードだけが実行されます。

※ほんとは、単に反転させたところの前後に skipscript コマンドを埋め込んでるだけなんですけどね。



ファイルはここです。(右クリックメニューから「対象をファイルに保存」を選択)
zipを解凍すると exe ファイルがひとつ、ポロっと出てきます。あとは何もありません。
インストールも要りません。適当な場所において実行してみてください。

Windows XP SP3 / Vista で実行の検証済み。
XPの場合は実行に .net framework 2.0 以上が必要です。
あとそれから、もちろん NHK の TVML2 プレーヤーをインストールしてないと動きませんから・・・。

2008年1月4日金曜日

アクエストーク と C# で音声合成の実験

マイクロソフトの音声合成インターフェース、SAPIの最新版 5.3 には日本語の音声合成が付属していないし、フリーの対応音声合成モジュールもない。前のバージョン SAPI4にはそれなりのがあったわけだが、そもそもヤル気のなさげなものばかり。公的な研究機関のつくったGtalk なんぞ、余りに不自然で変すぎる。聞いたところによると、自然に聞こえるとかそういったことにはあまり興味がないらしい。っていうか研究はすでに終了しているし。
そんななか、SAPIと関係ないけれど、フリーで結構イイ声を出してくれるものを見つけた。・・・っていうかWikiPediaにリンクがあったんだけどね。AQUEST社というところが出している「AquesTalk」という製品で、Linux版は有償だが、Windows版は無償という、普通と逆なもの。組み込み用ということでサイズは小さいのだが、なかなかよい声をだす。
でも辞書がないので、普通に文章を読むことはできない。まぁそれはそれで趣味で使う分には問題なし。もし普通文を読ませたいなら、それこそGTalkのガラティアプロジェクトから持ってくればいいかな。

ということで、しゃべらせてみよう。 必要なのは、
  • Windows XP/SP2
  • Microsoft Visual C# 2005 Express Edition

こんだけ。

プログラムはこんな感じ。



using System;
using System.Windows.Forms;
using System.Runtime.InteropServices; // DllImport

namespace Sample{
///
/// メインフォーム
///

public partial class MainForm : Form
{
///
/// コンストラクタ
///

public MainForm()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int iret = Program.AquesTalkDa_PlaySync("これわ、ふり'ーの、おん'せい/ごーせい/そ'ふと、あ'くえすと'ーくで/しゃべって/います。", 100);
}
}
///
/// アプリケーション開始クラス
///

static class Program
{
[DllImport("AquesTalkDa.dll")]
public static extern int AquesTalkDa_PlaySync(string koe, int iSpeed);
[STAThread]
static void Main()
{
Application.Run(new MainForm());// フォームを起動
}
}
}

このプログラムのプロジェクト Talk_01.zip (ダウンロードできます)



このサンプルは、AQUEST社のブログで紹介された方法そのままなので、次は、もうちょっと複雑な発声をやってみる。



上の実験では単にしゃべらせるだけなのでしゃべってる間は何もしないで待つ、ってことでもよかったんですが、しゃべっている間に何かさせようとか、複数のしゃべりを同時にするとかだと待っててはいけません。つまり非同期って奴ですね。

そこでAquesTalkDa_PlaySync()じゃなくて、AquesTalkDa_Play()を使わなければならない。



using System;
using System.Windows.Forms;
using System.Threading;
using System.Runtime.InteropServices; // DllImport

namespace Sample
{
///
/// メインフォーム
///

public partial class MainForm : Form
{

// 再生フラグ
private const int SND_SYNC = 0x0; // 同期再生
private const int SND_ASYNC = 0x1; // 非同期再生
private const int SND_MEMORY = 0x4; // バッファからの再生
private const int SND_LOOP = 0x8; // ループ再生
private const int SND_NOSTOP = 0x10; // 再生中のサウンドを停止しない
private const int SND_NOWAIT = 0x2000; // ビジー状態なら即座に処理を返す

///
/// コンストラクタ
///

public MainForm()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
IntPtr hMe = Program.AquesTalkDa_Create();

IntPtr hwnd = Program.FindWindow(this.Text, null);

int iret = Program.AquesTalkDa_Play(hMe, "これわ、ふり'ーの", (int)120, hwnd, 0, 0);

IntPtr hMe2 = Program.AquesTalkDa_Create();

iret = Program.AquesTalkDa_Play(hMe2, "おん'せい/ごーせい/そ'ふと", (int)60, hwnd, 0, 0);

//Program.AquesTalkDa_Release(hMe);
//Program.AquesTalkDa_Release(hMe2);
}

private void button2_Click(object sender, EventArgs e)
{

IntPtr size;
IntPtr voiceBuffer = Program.AquesTalk_Synthe("あ'くえすと'ーくで/しゃべって/い'ます。", 100, out size);

Program.PlaySound(voiceBuffer, 0, SND_MEMORY | SND_ASYNC);

//Program.AquesTalk_FreeWave((IntPtr)voiceBuffer);
}

private void MainForm_Load(object sender, EventArgs e)
{

}
}

///
/// アプリケーション開始クラス
///

static class Program
{
//[DllImport("AquesTalkDa.dll")]
//public static extern int AquesTalkDa_PlaySync(string koe, int iSpeed);
[DllImport("AquesTalkDa.dll")]
public static extern int AquesTalkDa_Play(IntPtr hMe, string koe, int iSpeed, IntPtr Wnd, uint msg, uint dwUser);
[DllImport("AquesTalkDa.dll")]
public static extern IntPtr AquesTalkDa_Create();
[DllImport("AquesTalkDa.dll")]
public static extern void AquesTalkDa_Release( IntPtr hMe);
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("AquesTalk.dll")]
public static extern IntPtr AquesTalk_Synthe(string koe, int iSpeed, out IntPtr size);
[DllImport("AquesTalk.dll")]
public static extern void AquesTalk_FreeWave(IntPtr wav);

[DllImport("winmm.dll", EntryPoint = "PlaySound")]
public static extern int PlaySound(
//[MarshalAs(UnmanagedType.LPArray)] byte[] pszSound,
IntPtr pszSound,
int hModule,
int dwFlags);


///
/// アプリケーションのメイン エントリ ポイントです。
///

[STAThread]
static void Main()
{
// コントロール等を Windows XP のスタイルにします。
// はずしてもかまいません。
Application.EnableVisualStyles();

// GDI+ を使用してコントロールのテキストを描画します。
// はずしてもかまいません。
Application.SetCompatibleTextRenderingDefault(false);

// フォームを起動します。
Application.Run(new MainForm());
}
}
}


こんな具合に、ずいぶん面倒くさくなる。

このプログラムのプロジェクト Talk_02.zip (ダウンロードできます)