質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

3179閲覧

Unity 立方体の作成

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2018/01/14 20:59

編集2018/01/14 21:00

あるサイトを参考にして、メッシュで立方体を作成しました。書かれている通りにやったので、作成することは出来たのですが、スクリプトでよく分からない部分があります。教えていただけるとありがたいです。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class MeshingProc : MonoBehaviour { 6 7 private Mesh mesh; 8 private new MeshRenderer renderer; 9 private new MeshCollider collider; 10 public int vertexCount = 0; //頂点の数 11 private List<int> newTriangles = new List<int>(); //三角形 12 private List<Vector3> newVertex = new List<Vector3>(); //頂点 13 private List<Vector3> newNormarls = new List<Vector3>(); //法線 14 private int[] windingOrder = new int[3] { 2, 1, 0 }; //三角巻き取り 15 private Vector3[] square = new Vector3[5]; 16 17 // Use this for initialization 18 void Start () { 19 mesh = gameObject.GetComponent<MeshFilter>().mesh; 20 renderer = gameObject.GetComponent<MeshRenderer>(); 21 collider = gameObject.GetComponent<MeshCollider>(); 22 GetVertices(); 23 MakeMesh(); 24 } 25 26 void revertOrder() 27 { 28 int i = windingOrder[0]; 29 windingOrder[0] = windingOrder[2]; 30 windingOrder[2] = i; 31 } 32 33 void GetVertices() 34 { 35 XSquare(Vector3.zero, Vector3.left); 36 XSquare(Vector3.right, Vector3.right); 37 YSquare(Vector3.zero, Vector3.down); 38 YSquare(Vector3.up, Vector3.up); 39 ZSquare(Vector3.zero, Vector3.back); 40 ZSquare(Vector3.forward, Vector3.forward); 41 } 42 43 void MakeMesh() 44 { 45 mesh.Clear(); 46 47 mesh.vertices = newVertex.ToArray(); 48 mesh.triangles = newTriangles.ToArray(); 49 mesh.normals = newNormarls.ToArray(); 50 renderer.material = new Material(Shader.Find("Diffuse")); 51 52 collider.sharedMesh = null; 53 collider.sharedMesh = mesh; 54 } 55 56 void XSquare(Vector3 startPos,Vector3 normal) 57 { 58 square[0] = startPos; 59 square[1] = startPos + Vector3.forward; 60 square[2] = startPos + Vector3.up; 61 square[3] = startPos + Vector3.forward + Vector3.up; 62 square[4] = normal; 63 64 AddSquare(); 65 } 66 67 void YSquare(Vector3 startPos, Vector3 normal) 68 { 69 square[0] = startPos; 70 square[1] = startPos + Vector3.right; 71 square[2] = startPos + Vector3.forward; 72 square[3] = startPos + Vector3.right + Vector3.forward; 73 square[4] = normal; 74 75 AddSquare(); 76 } 77 78 void ZSquare(Vector3 startPos, Vector3 normal) 79 { 80 square[0] = startPos; 81 square[1] = startPos + Vector3.right; 82 square[2] = startPos + Vector3.up; 83 square[3] = startPos + Vector3.right + Vector3.up; 84 square[4] = normal; 85 86 AddSquare(); 87 } 88 89 90 void AddSquare() 91 { 92 // Order in wich windingOrder is inverted 93 if (square[4].x > 0 || square[4].y > 0 || square[4].z < 0) 94 { 95 for (int j = 0; j < 2; j++) 96 { 97 for (int i = 0; i < 3; i++) 98 { 99 newVertex.Add(square[i + j]); 100 newTriangles.Add(vertexCount + windingOrder[i]); 101 newNormarls.Add(square[4]); 102 } 103 104 vertexCount += 3; 105 106 revertOrder(); 107 } 108 } 109 else 110 { 111 for (int j = 0; j < 2; j++) 112 { 113 revertOrder(); 114 115 for (int i = 0; i < 3; i++) 116 { 117 newVertex.Add(square[i + j]); 118 newTriangles.Add(vertexCount + windingOrder[i]); 119 newNormarls.Add(square[4]); 120 } 121 122 vertexCount += 3; 123 } 124 } 125 } 126} 127

void AddSquare()の部分が、なにをしているのかよく分かりませんでした。
normalというのは法線のことだと思うのですが、法線にも座標があるのでしょうか?調べたのですが、説明するサイトが出て来ませんでした。
windingOrderは恐らく三角巻き取りだと思い、コメントを書いたのですが、正確にそうなのかは分かりません。

回答よろしくお願いします。

参考にしたサイト↓

http://www.voxelab.fr/en/2015/09/maillage-procedural-dans-unity/

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ご質問者さんが「三角巻き取り」をどのように解釈されているかちょっと判りかねますが、windingOrderは三角形の3つの頂点を右回りにするか左回りにするかを決定するために使っているものと思われます。3Dグラフィックスにおいては、描画負荷軽減のためポリゴンの裏面の描画処理を省略するということがしばしばありますが、この右回り・左回りが不適切だと、キューブを描画したときに表面が透けて裏面が見える...なんてことになる場合があります。実際にwindingOrderを逆順にして試してみると面白いかと思います。

AddSquare内ではっきりしないのはnewNormalsの部分ということでしょうか。ご推察の通り、各頂点には普通は「その頂点における面の向き」を表す法線ベクトルを設定することが多いでしょう。こちらはキューブの陰影付けに関わってきて、これが正しくないとキューブをライトで照らした時に奇妙な陰影ができるかと思います。

これらは【連載】Unity時代の3D入門 - 第1回「ポリゴンを描画してみた」 - てっくぼっと!のような記事がご参考になるのではないでしょうか。

「法線にも座標があるのでしょうか」とおっしゃるのは、たとえば「Vector3は座標を表す型のはずなのに、法線を表すためにそれを使うことができるのか」というような意味でしょうか?
Vector3は3次元座標だけでなく、3つ組の数を表すのに一般的に使われており、3次元ベクトルを表現するのに最適です。ここでは法線ベクトル(長さが1.0で向きが面の向き)の表現にVector3を使っているということになるでしょう。

投稿2018/01/15 02:32

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/15 04:49

回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問