ぼくの息抜き

ぼくの息抜き

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

CSS MenuMaker

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

f:id:bokunoikinuki:20180908232241p:plain

前回Part5で法線の向きでグループ分けするplane.GetSide()の使い方が少しわかった。

次はplaneとmeshの交点を求める関数について読んでいこうと思う。

planeとmeshの交点を求める関数を理解する

参考

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

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

  3. 【Unity】ベクトルを正規化する - ぱふの自由帳

実践

まずは対象の関数の引数をみる。

    // planeとmeshの交点を求める
    private void CalcCrossPoint(Plane plane, List<Vector3> group1, List<Vector3> group2)

Part5の時に頂点を法線側かそうでないかの振り分けの時の引数と同じだ。

次に定義されている変数を見ていく。

        float distance = 0;
        Vector3 basePos; // 計算する基準となる頂点
        Vector3 tmpPos1; // 基準点以外の頂点1
        Vector3 tmpPos2; // 基準点以外の頂点2

これだけじゃわからん。次の行に進んでいく。

        // 少ない方からplaneに対して交差するpointを聞く
        if (group2.Count < group1.Count)
        {
            basePos = group2[0];
            tmpPos1 = group1[0];
            tmpPos2 = group1[1];
        }
        else
        {
            basePos = group1[0];
            tmpPos1 = group2[0];
            tmpPos2 = group2[1];
        }

ここで前回Part5で振り分けたグループのリストが出てくる。group1が法線側の頂点でgroup1が1つ、group2が2つに分けられたので、今回はelse側の処理になる。

f:id:bokunoikinuki:20180930103944p:plain

基準点basePosはRayを飛ばす基準点だ。

 

f:id:bokunoikinuki:20180930103700p:plain

出典はこちら

参考記事1にて絵で説明してくれるためとてもわかりやすい。

そして今回で言えばgroup2側の2つの頂点にRayを飛ばすため、その方向の座標をtmpPos1,tmpPos2に入れるようだ。

        // 少ない所から多い片方の頂点に向かってrayを飛ばす。
        Ray ray1 = new Ray(basePos, (tmpPos1 - basePos).normalized);
        // planeと交差する距離を求める
        plane.Raycast(ray1, out distance);
        // ray1がその距離を進んだ位置を取得(ここが交点になる)
        _pos1 = ray1.GetPoint(distance);

        // 同じようにもう片方も計算
        Ray ray2 = new Ray(basePos, (tmpPos2 - basePos).normalized);
        plane.Raycast(ray2, out distance);
        _pos2 = ray2.GetPoint(distance);

なんとなく理解できたが、Rayについての知識が足りない。

スクリプトリファレンスを見てみよう。

Ray - Unity スクリプトリファレンス

※記事書いた時RayCastと間違えていた。RayCastじゃなくてRay。

        // 少ない所から多い片方の頂点に向かってrayを飛ばす。
        Ray ray1 = new Ray(basePos, (tmpPos1 - basePos).normalized);

実際にMeshCutで使っている引数は2つ。

basePosはわかる。Rayワールド座標でのRayの開始地点。

次が問題だ。Rayの方向がなぜ、Vector3の座標だけじゃダメなのか?

(tmpPos1 - basePos).normalized

なぜ減算しているのか。normalizedとは何か。

長くなったので、次の記事でまた続きを書く。