ぼくの息抜き

ぼくの息抜き

気ままな二人が記事を書くことで息抜きしていくブログ

CSS MenuMaker

【VR,OculusGo,Unity】素人がメッシュカットについて実際に触って理解する Part2

f:id:bokunoikinuki:20180908232241p:plain

前回ポリゴンメッシュを参考記事を見ながらスクリプトで作って見た。

 

さて次はまた参考記事を元にこのポリゴンメッシュを切るためのPlaneなるものをスクリプトで作る。

ポリゴンメッシュを切るPlaneを作る

参考記事

  1. 【Unity】メッシュカッターについて その2 - ぐーるらいふ

  2. Plane - Unity スクリプトリファレンス

  3. UnityEngine.Meshの内部構造解説

  4. 法線/垂直ベクトルの計算 - Unity マニュアル

  5. 【Unity】Vector3を完全攻略!加算・比較もできるって知ってた? | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト

  6. Unityでベクトルを扱おう - WonderPlanet DEVELOPER BLOG

  7. Vector3.Cross - Unity スクリプトリファレンス

  8. 【Unity】キャラクターから見て対象への角度を「-180~180度」の範囲で求める - テラシュールブログ

ありがとうございます。

今回学んだこと

Planeとは

3DオブジェクトにあるPlaneでは無く、
たった一つのpointとたった1つのnormalを持つ平面を表す構造体だ。 

 Plane.GetSide(Vector3)

これを使うらしく、これで得られるのはbool型。

内部的には
その頂点が法線方向にあればtrue。
無ければfalseなだけだ。 

 法線がわからん。

Normal(法線)とは

参考記事3によると、

  • 各頂点についての面の向き
  • ライティングや衝突判定などに活用される
  • Vertexと同じ長さのVector3型配列

 各頂点について面の向き?Vector3なのか?全然わからんので、また調べる。

参考記事4によると、

f:id:bokunoikinuki:20180909071615p:plain

法線ベクトル(または平面に垂直なベクトル)はメッシュ生成に頻繁に使用され、経路探索およびその他の状況で便利かもしれません。平面上の 3 つの点、例えばメッシュ三角形の角、を取得すれば、法線を見つけるのは容易です。3 つのうちのひとつを任意に選んで、残る二つから各々引き算することで、二つのベクトルが得られます: 

 メッシュではよく使われるのね。ベクトル。高校数学ほとんどやってないからわからん。名前を聞いたことあるレベル。

とにかくa,b,cのVector3による座標を引き算するとSide1,2が求まる。

NormalはSide1とSide2を掛けたものであると、計算は簡単だな。

var a: Vector3;
var b: Vector3;
var c: Vector3;

var side1: Vector3 = b - a;
var side2: Vector3 = c - a;

でもVector3同士の掛け算ってどうなってるんだ?

Vector3について

Vector3についてわかったつもりになっていたが、よくわかっていなかった。

参考記事5,6を読んで噛み砕いて理解してみる。

  • Vector3型は3次元ベクトルを扱う型
  • Vector3は3つのfloat型
  • 「Vector3.x」で個々の変数を取得できる
  • 加算はそのまま,x+x, y+y, z+z
  • 比較演算子も使用できる
  • newしなくても作成する方法はたくさんある
        void Start () {
            // 様々な作成
            Vector3 v1 = Vector3.back;             // ( 0, 0,-1)
            Vector3 v2 = Vector3.down;             // ( 0,-1, 0)
            Vector3 v3 = Vector3.forward;          // ( 0, 0, 1)
            Vector3 v4 = Vector3.left;             // (-1, 0, 0)
            Vector3 v5 = Vector3.one;              // ( 1, 1, 1)
            Vector3 v6 = Vector3.right;            // ( 1, 0, 0)
            Vector3 v7 = Vector3.up;               // ( 0, 1, 0)
            Vector3 v8 = Vector3.zero;             // ( 0, 0, 0)
        }
  • ベクトルの長さはmagnitudeで取得
  • Vector3.magnitudeを比較することで、ベクトルの長さを比較できる
    ⇨magnitudeの代わりにsqrMagnitudeを使った方が高速
  • ベクトルの長さはfloat値を掛けたり、float値で割ったりすることで長さや向きを変えられる
  • normalizedは、そのベクトルの長さを1にしたベクトル
  • Vector3同士の掛け算はできない!
           Vector3 v1 = Vector3.forward;
            Vector3 v2 = Vector3.up;
            Vector3 v3 = v1 * v2;
            
            print ("v1 = " + v1);
            print ("v2 = " + v2);
            print ("v1 * v2 = " + v3); 
    最後の行でエラーがでる。
  • Normalを出すときは掛け算ではなくVector3 = Vector3.Cross(side1, side2);を使う

まとめ,感想

今回は基礎知識でわからないことだらけだったので、情報収集だけで終わってしまった。

次こそはこのポリゴンメッシュを切るためのPlaneなるものをスクリプトで作る。