Inpaintを購入してみた。

writer : uxicカテゴリー etcタグ ,

App Storeをたまたま覗いていたら、Inpaintという写真のいらない部分を簡単に削除してくれるソフトが85円のセールをやっていたので購入してみました。で、Twitterで反応がよかったので試して見ました。
Inpaintでいらない部分を削除してみた。

う〜ん・・・。photoshopで手でやった方がきれいに仕上がると思いますが、何しろソフトがシンプルで使いやすいので、まぁいいんじゃないでしょうか。85円だし。
ついでにこれは無理だろって画像も試して見ました。
Inpaintで無理やり背景を消してみた。

ですよね・・・。
これは別にInpaintが問題なのではなくて、Photoshopでやっても大して変わらないと思います(比べてませんが)。
Adobeがサンプルで出しているやつは大抵うまくいくような素材を使ってますからね・・・。

App Storeはこういった単機能に絞ったソフトがよく出ていて、しかもたまに安くなっているのでいいですね。

オブジェクトの回りに動的なGUIを配置する。

writer : uxicカテゴリー unityタグ

UnityのGUIは動かないというイメージがありますが、実際には毎フレームごとに座標を与えてグリグリ動かすことができます。
今回は戦国無双みたいなゲームとかで、よく敵キャラクターの頭の上にある体力ゲージとか名前をイメージしたスクリプトをやってみました。

以下はデモです。Shiftキーを押しながらドラッグすることで動かせます。
でもなぜか私の環境のmacでは、safariだとライトがおかしいとかchromeだとそもそも動かないです・・・。

デモ

ワールド座標をスクリーン座標に変換する。

まず、ゲームオブジェクトのワールド座標をスクリーン座標にするためには、カメラオブジェクトのメソッド、WorldToScreenPoint(Vector3)を使います。

Vector3 ScreenPosition = camera.WorldToScreenPoint(target.position);

これをカメラオブジェクトにつけます。
ちなみにスクリーン座標をワールド座標にするのはScreenToWorldPoint(Vector3)です。

オブジェクトの回りに動的なGUIを配置する。

流れとしては、Update関数でオブジェクトの座標(Vector3)を取得してスクリーン座標に変換し、その変数のXとYの数値をOnGUI関数のRectの引数に渡しています。

using UnityEngine;
using System.Collections;

public class LookATGUI_C : MonoBehaviour {

    public Transform GUIWatchPoint;

    private Vector3 ObjectPoint;// オブジェクトのワールド座標
    private Vector3 ObjectPointPlus;// オブジェクトのちょっと上の座標
    private Vector3 GUIScreenPoint;// オブジェクトのスクリーン座標

    private float ScreenHeight = Screen.height;

	void OnGUI () {
		GUI.Box(new Rect(GUIScreenPoint.x-60,ScreenHeight - GUIScreenPoint.y + 40,120,40),"Hello!");
	}

	void Update () {
		// Objectの座標を代入
		ObjectPoint = GUIWatchPoint.position;
		ObjectPointPlus = new Vector3(0,0,0) + ObjectPoint;

		GUIScreenPoint = camera.WorldToScreenPoint(ObjectPointPlus);
	}
}

注意点としてオブジェクトのY座標は、上に上がるとプラス、下に下げるとマイナスなのに対して、GUIのRectの引数のY座標は上に上がるとマイナス、下に下げるとプラスになるところです。
あとスクリーン変換した座標をそのままいれればよいというわけではなく、最初にスクリーンの高さを取得してそれにマイナスしてやる・・・もう書いててワケわからないのでスクリプトを参照のこと。
これだけのためにかなり時間かかりました・・・。

UnityのC#でXMLを読み込む。

writer : uxicカテゴリー unityタグ ,

xmlデータを取得して内容を読み込むことができると、例えばTwitterのタイムラインを表示させたりブログの記事を読み込んだりと、様々なWEBアプリケーションと連携することができて夢が広がります。

javascriptならxmlを簡単に読み込める形にしてくれる外部jsを読み込むか、C#ならxmlクラスがあるのでそれを使います。で、javascriptだと日本語の情報が無いのもありなかなかうまくいかないので、どうせならということでC#でやってみました。

Twitterのタイムラインのxmlについて

読み込むxmlはTwitterのタイムラインの方が今っぽいですかね。
以下のアドレスで@motar_24のTweet(20件)がXML形式で取得できます。ブラウザのアドレスに直接打っても確認できますが、safariだと改行されずそのまま表示されます。Chromeだと整形して表示してくれますね。

http://twitter.com/statuses/user_timeline/motar_24.xml

XMLの記述内容についてはここでは省略しますが、タグで囲まれているTweetテキストがあるのがわかると思います。このテキストを引っ張ってきて表示させるわけです。
注意点として、ローカルからならTwitterのAPIにアクセス(XMLを取得)できますが、Unityのプロジェクトがウェブに公開される場合(webプレーヤー)はクロスドメインの関係で取得できないようです。flashの場合はphpをかましてできるみたいですが、Unityはわかりません。
http://d.hatena.ne.jp/nakamura001/20110730/1312044175

XMLを取得するC#

Macでやりたい場合は、Monoをインストールする必要があります。
mono

Windowsの場合、7やVistaなら問題ないですが、XPなら.NET Frameworkをインストールする必要があるかもしれません。

内容をコメントしてあるので参考にしてください。

using UnityEngine;
using System.Collections;
using System.IO;// 追加で記述
using System.Xml;// 追加で記述

public class XMLLoder : MonoBehaviour {

	// TwitterのxmlデータのURL
	string XMLFilePath = "http://twitter.com/statuses/user_timeline/motar_24.xml";

	XmlDocument doc;// XMLオブジェクト
	XmlNodeList nodeListtext;//テキストの配列

	void Start () {
		doc = new XmlDocument();// XMLオブジェクトを生成
		doc.Load(XMLFilePath);// XMLのファイルを読み込む

		// 全部配列
		nodeListtext = doc.SelectNodes("statuses/status/text");// テキストの配列のできあがり

		// あとは配列を読み込むだけ
		Debug.Log(nodeListtext[0].InnerText);

	}
}

上記のスクリプトをコピペしてGameObjectとかに貼りつけてプレビューすれば、ConsoleにTweetが表示されているはずです。
実際に使うときにはGUI.Labelに入れたりします。できてしまえば簡単ですね!

クリエイターズマーケットとライブモデリング

12月3、4日の土日に、ポートメッセ名古屋で開かれた「クリエイターズマーケット」にC3Dのメンバーとして参加してきました。
今回はC3Dのメンバー6人が、「未来」をテーマに作品を制作し、会場ではディスプレイを繋いでライブモデリングをやりました。
まず自分の作品から。

supersumo

未来というテーマに対してどうしてもロボット的なものを作りたくなってしまい、単純にロボットにしてもつまらないなぁということで日本の文化(国技ではないんですよね)である相撲を映画「リアル・スチール」な感じでスポーツできるロボットとしてみました。ほぼ全部ZBrushで制作。
拳はよくできてる感じがするのですが、それ以外はディテールが甘いですね・・・。時間の都合で足とか酷い。でもZBrush4の新機能を色々と使ったのでよい勉強になりました。

さてクリマ当日は2日ともライブモデリングをやりましたが、子どもがすごい食いついてきて楽しかったです。でもどちらかというと作っているモデルに対して興味があるのではなく、ZBrushというソフトの機能に興味がある感じです。モデルが気に入ってもらえるように鍛錬しないとですね。

1日目。なぜかカラスになりました。
ライブモデリング カラス

2日目は皆で「くま」を作るということになりました。
ライブモデリング くま

ライブモデリングは自前のMacbook Airを24インチapple Displayにつないでやったのですが、Macbook Airが400万ポリゴンとかになっても動いたのにはちょっと驚きました。いい買い物した。

色々と勉強になった今回のクリマでしたが、次からは別のアプローチができたらなと思っています。立体出力とかアプリとか。

UnityでWindowsのソフトを立ち上げる。C#

writer : uxicカテゴリー unityタグ ,

EXE形式のWindowsUnityアプリから、Windowsのソフトを立ち上げるやり方。ブラウザ向けにビルドしようとするとエラーになりました。Macはもちろん不可。
当初はそんなことができるか見当もつきませんでしたが、Facebookで質問したところ教えていただきました。
スクリプトはC#です。WindowsのコマンドやC、C++も入力できるようですが、そちらはUnity Proにする必要があります。

using UnityEngine;
using System.Collections;
using System.Diagnostics;

public class OpneExcel : MonoBehaviour {

	void OnGUI ()
	{
		if(GUI.Button(new Rect(10,10,150,120),"Open Explorer"))
		{
		System.Diagnostics.Process.Start("EXPLORER.EXE","C:¥¥Documents and Settings¥¥アカウント¥¥My Documents");
		}
	}
}

上記の例では単純にボタンを押すとエクスプローラーが立ち上がります。

今回はC#なので色々とインポートしてMonoBehaviourを継承してから記述します。
まずはSystem.Diagnosticsを読込んで、後はSystem.Diagnostics.Process.Start関数で読込むだけです。

System.Diagnostics.Process.Start("アプリケーション","ファイルのパス");

注意する点として、ファイルのパスに使う¥マークは2つ必要です。C#の仕様で、多分バックスラッシュがどーのっていう理由だと思います。
あまりWindows用のEXEファイルを起動させる機会はあまりないと思いますが、業務用であれば需要がありそうです。

ということで久しぶりの投稿でした。

Older Posts »
meta