作成者別アーカイブ: saitottammas

モデリング矯正力バイブル01

標準

ディズニーさんのモデリングを参考に、、、などと思っても、やはり細かい部分がわからない。
結局、こちらの参考本を頼るのが早いのかも。。。

キャラクターモデリング「造形力矯正バイブル」田島キヨミ著

Blenderで。。

1.ミラーモディファイアで形が美しくなるまで成型

0)下書き絵(本を購入すること^^)をあわせる。レンズを150mmにする。

1)Cube→wキーサブディビジョンスムーズをかける(分割3)。大きさを頭部の球体にあわせる。

2)上記で大きさをあわせてから、半分を消して、ミラーモディファイア→中央あわせのClippingをオンにしておく

3)横向きにして、後ろ部分は耳から下、前部分はあごあたりを削除。あごまで延ばす。

4)正面からも調整。

5)頂点数をあわせるため、16角形のシリンダを首として設置。これも、大きさをあわせてから、半分を削除する。

6)首と頭、後ろ3枚、あごの下から3枚をつなぐ。

7)口のライン、あご下ライン、首の後ろ上を2本ループカット。

kawaii01

8)横からみて、鼻下3点を前方にちょっと出すイメージで頬の丸みを出す。

9)あごラインを上にやや上げ、下のラインをあごの下絵にあわせるイメージで、あごの丸みを表現。

10)首の後ろの造形を調整する。(あご骨と脊椎の付き方を意識)

11)正面からみて、サブディビジョンサーフェス2段階(Ctrl-2)でずれる部分をO(プロポーショナル変形)やNormal(法線)方向に移動を使って調整。

12)頬がこけている、あごがとんがりすぎている、などに気がつくので修正する。

kawaii02

13)横からみて、目のライン一周、鼻のライン多角形をはさんで一周、その多角形から縦に頭頂方向にループカットする。必ず、Alt-Sでふくらみを調整すること。

14)がたつきを見るために、マテリアルを設定し、シェーディングを変えて反射光などで確認する。(アンビエントオクルージョンのスイッチもオンにしておくと、急激な角度変化などを確認できて良いかもしれない)

kawaii03

15)横からみて、先ほどの多角形の上部を削除し、10点の輪で、耳をひとまわり大きく囲む。首後ろ部分へのつながりがガタツクので、修正する。

16)耳穴一周選択し、Eで拡張、内側の耳外周にあわせる。

17)正面からみて、GlobalのX方向にEで拡張し、S-X-0でX軸上でそろえる。そのまま、顔のラインに水平になるよう、回転。上から見ても、耳の方向に回転。

18)耳を接続するほうに、斜めにJで切れ込みをいれ(中、3メッシュ残して、上下とも)、それにはさまれた3点を削除する。

kawaii04

19)耳後ろをCtrl-Rで一周カット。その内側を、K(ナイフ)を使って、頂点から頂点までカット。

20)できた内側の5ポリゴンを選択して、Sで縮小、耳の形ができる。

21)外側の穴を選択し、何段階かEで拡張→縮小して奥に押し込むことで、耳の形をつくる。穴はFでふさぐ。

22)耳裏の三角ポリゴンを解消するため、K(ナイフ)で分割する。形も整える。

kawaii05

2.目・鼻・口 ふくらみを意識して

23)正面から見て、耳より一つ上のラインから鼻ラインをK(ナイフ)でカット。カットした一番下の面で鼻のラインを作るようにカット。その下2つのメッシュを横切るように、口のラインを2本の線でカット。

kawaii06

24)鼻の持ち上げと移動

25)口にあたる部分(上図で赤塗り部分の面)を削除。口から放射状につながりを修正。

kawaii07

26)口の周りを2本ループカット。この2本と最初の穴で唇のだいたいの形がとれる。下唇の中央部分は下側にそろえるようなつもりで、上唇は、逆に均等に横ラインを並べるつもりで。口角は少し奥に。唇中央はとんがっているが、口の端はなだらか。

27)鼻下からあご上ライン一周をつくる。それにしたがって、ラインをずらす。

kawaii08

28)目のまわりにカットをいれる。ループカットを止めたい面をあらかじめ(H=ハイド)で隠しておくと、楽(下図 黄色の面)。赤ラインをループカットやJでつなぎ、青バツラインを削除。Alt-Hで隠していた面を戻す。

kawaii09

29)田の字に出来た、目のまわりの点を移動して形を整え、Eで内側に出した面を目の下絵にあわせる。目の中の4枚の面は削除する。

30)別オブジェクトで眼球をいれる。眼球にあわせて修正。

31)まぶたの厚さ分、奥にまっすぐ押し出す。もう一回押し出したものは、眼球を包むように広げる。

32)不要なループカットを避けるため、目のまわりをHで隠しておいてから、カットを増やす。

kawaii10

33)目の周りがループになるよう、線をつなぎかえる。

kawaii11

34)目のふち際の両方をループカットして、形を整える。

kawaii12

35)鼻のまわりのループを修正

kawaii13

36)こめかみから顎にかけても整える。

kawaii14

37)口の穴を厚み分だけまっすぐ奥へ拡張(E)。もう一回拡張して、奥でラッパのように広げる。

38)口のまわりのループを修正する。

kawaii15

39)口の形が整ったら、唇ラインの外と内に一本づつループカットラインをいれ、唇のふくらみを出す。

40)途中で止まっていた線をつなげる。

kawaii16

41)首後ろつけかえ

kawaii17

42)額部分。

kawaii18

43)こめかみ

kawaii19

44)首筋

kawaii20

45)頭の後ろ、首の後ろなど、均等割りにしたい部分を選んで、W(スペシャルメニュー)からRelux(ユーザー設定でオンになっているか確認)。

Blender to Unity 01 Terrain

標準

Blender LandscapeをUnity Terrainに適用するまで

A.Blender作業

1)LandScapeを利用して地形をつくる(パラメータをいろいろいじってみる)

左下に出てくるオプションで、Subdivisionは256に設定しておくと十分細かい地形を作ることが出来る。

landscape01

2)ギザギザが気になるようなら、スカルプトモードでShiftを押しながら、少しなめらかにする。

3)マテリアルを追加。色は白。Shadelessをチェック。

landscape02

4)テクスチャをBlendタイプで追加。

landscape03

5)カメラ設定。真上から。

landscape04

6)レンダリング画像設定。16bitのグレースケールになるように。また、2の2乗に1ピクセル足した大きさになるように。レンダリングしたものを保存。png形式でよい。

landscape05

7)レンダリング結果画像(png)

2049

B. Krita作業

Blenderで出力したpngファイルをそのまま、Unityで読ませようとしてうまくいかなかったので、Kritaでデータ変換する。r16形式データにするだけ。

landscape06

C.Unity作業

1)Unityで新規Terrain追加。

マテリアルがテラテラ反射していたので、適当なマテリアルに変更。

landscape07

Import Rawというボタンをクリックし、先ほど保存しておいた、Kritaで作成した、.r16ファイルをインポートする。その際、作成した大きさとMacで作成したか、Winで作成したかを確認。高さが極端に高くなるのを抑えるため、読み込み時のheightの値を少し下げるとよい(例えば、600になっていたら、それを200にするなど)

2)あとは普通のTerrainとして、樹木追加も可能、ブラシによる変更も可能。Terrainコライダーも無事についている。

landscape08

画像の縁の部分がなぜか、1ピクセル分、立ち上がっているので修正する必要があるかも。

 

UnityチュートリアルSpaceShooterその6「サウンド得点完成へ」

標準

9.サウンド

Unityには3つのサウンド関係のキーワードがある。
1)Audio Clips, 2)Audio Sources, 3)Audio Listener
オーディオクリップは、サウンドファイルが収納されている音のデータである。

Audio Clipを選択すると、インスペクターには、プレビューとして、波形、試聴ボタン、ループボタンが現れる。さらにそのクリップの詳細がプレビュー画面の下に現れる。

1)オーディオクリップの3Dサウンドを無効にする(相対位置によって、聞こえ方が変わる効果)

2)クリップをプレファブオブジェクトにドラッグすると、自動的にオーディオソースコンポーネントが追加され、サウンドクリップを指定することが出来る。

Play On Awakeがチェックされていることを確認する。explosion_asteroidとexplosion_playerのプレファブに、それぞれのサウンドを入れる。

3)Playerが武器を発射したときのサウンドを入れる。ドラッグしただけだと、オーディオソースコンポーネントのPlay On Awakeが有効になってしまうので、無効にする。

4)Playerが武器を発射したときだけサウンドを出したいので、PlayerControllerスクリプトに書き加える。

ちょうど、武器(shot)をインスタンス化する部分に音をいれればいいことがわかる。
(ビデオでは、audio.となっているが、GetComponetを使わないとUnity5では動かない)

https://oc.unity3d.com/index.php/s/rna2inqWBBysn6l?_ga=1.260994632.411228565.1453178645

↑Unityチュートリアル提供、変更点一覧

private AudioSource audioSource;

void Start(){ 関数内に

audioSource=GetCompornent<AudioSource>();

を追加。

サウンドプレイするには、
 audioSource.Play();

10.バックグラウンドミュージック

バックグラウンドミュージックは、GameControllerゲームオブジェクトに持たせるのがいいであろう。サウンドをドラッグする。

Play On AwakeとLoopの欄を有効にする

11.音量調節

Playerについている武器発射の音量を 0.5にする。

GameControllerについている背景音楽の音量を 0.5にする

12.スコア表示

新規GameObjectを追加し、Score Textと名前変更する。Add ComponentからRendering→GUIText を選ぶ

Transformのポジションを0.5,0.5,0にすると、画面中央に文字を出せる。(つまり、ビューポートは、左下を(0,0)、右上を(1,1)とする座標上に位置する。

スクリーンスペース ピクセル単位
ビューポートスペース 左下が(0,0) 右上が(1,1)

GameControllerスクリプトを開き、スコア入力の仕組みをつくる。

public GUIText scoreText;
 public int score; (publicとなっているが、実際には別のクラスからいじるので、箱として見えないほうがいい。したがって、あとでprivate
に変更する)
void UpdateScore()
 {
 scoreText.text = "Score: " + score;
 }

準備が出来たら、ゲームスタートするときと、障害物を破壊したときに、上記UpdateScore関数が動くようにする。

1) Start()関数内に

score=0;
UpdateScore();

2) GameControllerが小惑星破壊を知ることは出来ないが、小惑星そのものに、自分が破壊されたタイミングをGameController内のpublic関数に伝えることができる。

GameController関数内にpublic関数追加

public void AddScore(int newScoreValue)
{
   score += newScoreValue;
   UpdateScore();
}

小惑星プレファブを確認すると、プレイヤーが小惑星を破壊するのは、DestroyByContactスクリプトで行っている。したがって、そのスクリプトにGameControllerのAddScoreを呼ばせる。DestroyByContactスクリプトに

public int ScoreValue;

を追加しておき、GameControllerクラスの変数 gameControllerを作成する。

private GameController gameController;

その上で、破壊が起きたあとに、AddScoreを呼び出す。

gameController.AddScore(scoreValue);

また、Start()のところに、

   GameObject gameControllerObject = GameObject.FindWithTag ("GameController");
        if (gameControllerObject != null)
        {
            gameController = gameControllerObject.GetComponent <GameController>();
        }
  }

を記述する。

unityチュートリアルSpaceShooterその5「ゲーム化」

標準

その4で作成できた小惑星に、弾を動かすのに作ったMoverというスクリプトを適用し、スピードに-5を入力する。これで小惑星が落ちてくる。

出来上がった小惑星は、プレファブ化し、シーン上から削除する。

6.ゲームコントローラーの追加

1)空のGameObjectを追加し、GameControllerと名前変更する。タグとしてプリメイドのGameControllerをつける。リセットは必ずしも必要ないが、一応場所、回転、拡縮をリセットする。

2)新規スクリプト GameControllerを追加

3)GameControllerで行いたいことは、まず、小惑星(障害物~hazard)を枠外からランダムポジションで落としてくること。

これをSpawnWavesという関数で実現することにする。
public GameObject hazard;

void SpawnWaves(){

}

Start関数で、この関数を呼び出す
void Start(){

SpwanWaves();

}

4)SpawnWaves関数で何をしたいかというと、障害物を実体化すること。

Instantiate(hazard, spawnPosition,spawnRotation);

ひとまず、関数の中で上記を正しく表現するために、

void SpawnWaves()
{
Vector3 spawnPosition = new Vector3();
Quaternion spawnRotation = new Quaternion();

Instantiate(hazard, spawnPosition, spawnRotation);
}

としておく。

このhazardは、publicで設定できるが、spawnPositionとspawnRotationはどうすればいいか。

5)positionは、Vector3変数であるので、
public Vector3 =new spawnValues;

を宣言しておいて、xは-6から6までの乱数。yは0。zは、範囲外に出ている16とする。

SpawnWaves関数のほうで、spawnPositionの設定を行う。

Vector3 spawnPosition = new Vector3(Random.Range(-spawnValues.x,spawnValues.x),spawnValues.y,spawnValues.z);

6)回転のほうは、どうするかというと、クォータニオンは扱いがやっかいであるが、ここでは、初期値(回転なし)でいいので、ちょうど Quaternion.identityというのがあるので、それで定義しなおす。

Quaternion spawnRotation = Quaternion.identity;

7.小惑星が次々に現れる設定を作る

たくさん小惑星を落としたいからといって、単純にコピペを繰り返しても、同時に落ちてくるだけなので、うまくいかない。

とはいえ、繰り返しのために、for文を記述しておく。

public int hazardCount;

for (int i=0;i<hazardCount;i++){

繰り返したい内容;

}

コピペよりはプログラムはすっきりしたが、このままでは小惑星は同時にあらわれて、最初の段階でお互いに衝突して爆発してしまう。

小惑星が落ちてくる「間隔」が必要になる。

そこで、public float spawnWait;

を追加し、実体化のコマンドの下の行に、

WaitForSeconds(spawnWait);

を記述する。論理的には、これで合っているのだが、C#ではこれは動作しない。

時間を止めて、別の関数を走らせるためには、コルーチンをしかけなければならない。

コルーチンの場合、関数は、voidではなくなる。必ず、IEnumerator にする。

IEnumeratore spawnWaves(){ ~~~ }

そして、WaitForSeconds( ); の前に必ず、yield return new を追加する必要がある。

yield return new WaitForSeconds(spawnWait);

呼び出しも、単に関数名では呼び出せないので、Start関数の中は、呼び出す関数名をStartCoroutine関数で指定する。

StartCoroutine(soawnWaves());

すぐにスタートするのではなく、少しの間だけゲームスタートを待つほうが親切であるので、public float startWait;

を作っておくといい。これをspawnWaves()関数の最初で 少し待つというコマンドで実現する。

yield new WaitForSeconds(startWait);

また、小惑星の次の集団(hazardCountによる)が落下するまでの間を少し空けるために、

public float waveWait;

を作成する。これは、while(true)を使って、無限にループするようにする。

全体のプログラムは次のようになっている。


using UnityEngine;
using System.Collections;

public class GameController : MonoBehaviour
{
public GameObject hazard;
public Vector3 spawnValues;
public int hazardCount;
public float spawnWait;
public float startWait;
public float waveWait;

void Start ()
{
StartCoroutine (SpawnWaves ());
}

IEnumerator SpawnWaves ()
{
yield return new WaitForSeconds (startWait);
while (true)
{
for (int i = 0; i < hazardCount; i++)
{
Vector3 spawnPosition = new Vector3 (Random.Range (-spawnValues.x, spawnValues.x), spawnValues.y, spawnValues.z);
Quaternion spawnRotation = Quaternion.identity;
Instantiate (hazard, spawnPosition, spawnRotation);
yield return new WaitForSeconds (spawnWait);
}
yield return new WaitForSeconds (waveWait);
}
}
}


8.爆発の残りを消去する

ゲームをスタートすると、VFXのexplosionが画面にいつまでも残っている。

そこで、DestroyByTimeというスクリプトを書く

public float lifeTime;

void Start(){

Destroy(gameObject,lifeTime);

}

このスクリプトを、VFXフォルダ内プレファブの、explositon(3タイプとも)にコンポーネントとして追加しておく。