teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

タプルを使わないコードに変更

2020/01/20 22:01

投稿

Bongo
Bongo

スコア10816

answer CHANGED
@@ -71,7 +71,7 @@
71
71
  // 生えているようなものはダメ)メッシュなら、それぞれのエッジに対して
72
72
  // 対応するパートナーが1本だけ見つかるはず
73
73
  var tempEdgeList = edges.ToList();
74
- var edgePairs = new List<(Edge, Edge)>();
74
+ var edgePairs = new List<EdgePair>();
75
75
  try
76
76
  {
77
77
  while (tempEdgeList.Any())
@@ -80,7 +80,7 @@
80
80
  tempEdgeList.RemoveAt(0);
81
81
  var second = tempEdgeList.Single(e => (e.To.Identifier == first.From.Identifier) && (e.From.Identifier == first.To.Identifier));
82
82
  tempEdgeList.Remove(second);
83
- edgePairs.Add((first, second));
83
+ edgePairs.Add(new EdgePair {First = first, Second = second});
84
84
  }
85
85
  }
86
86
  catch (InvalidOperationException e)
@@ -90,12 +90,12 @@
90
90
 
91
91
  // 見つかったエッジペアの間に面を張る
92
92
  var additionalIndices = new List<int>();
93
- foreach (var (first, second) in edgePairs)
93
+ foreach (var edgePair in edgePairs)
94
94
  {
95
- var i0 = first.From.Index;
95
+ var i0 = edgePair.First.From.Index;
96
- var i1 = first.To.Index;
96
+ var i1 = edgePair.First.To.Index;
97
- var i2 = second.From.Index;
97
+ var i2 = edgePair.Second.From.Index;
98
- var i3 = second.To.Index;
98
+ var i3 = edgePair.Second.To.Index;
99
99
 
100
100
  if (normals[i0] == normals[i3])
101
101
  {
@@ -140,6 +140,12 @@
140
140
  public VertexReference From;
141
141
  public VertexReference To;
142
142
  }
143
+
144
+ private struct EdgePair
145
+ {
146
+ public Edge First;
147
+ public Edge Second;
148
+ }
143
149
  }
144
150
  ```
145
151
 

1

共平面ポリゴンに面を張らないよう変更、メッシュ更新タイミングをLateUpdateに変更

2020/01/20 22:01

投稿

Bongo
Bongo

スコア10816

answer CHANGED
@@ -96,6 +96,17 @@
96
96
  var i1 = first.To.Index;
97
97
  var i2 = second.From.Index;
98
98
  var i3 = second.To.Index;
99
+
100
+ if (normals[i0] == normals[i3])
101
+ {
102
+ // このエッジペアを挟んだ2枚の面が真っ平らになっているなら
103
+ // 引き伸ばし過程でこのペアが引き離されることはないだろうから
104
+ // (つまり、一方の三角形が光源に対して表を向いているなら
105
+ // それと同じ平面上にあるもう一方の三角形も表を向いている
106
+ // はずだから)面を張る必要はない
107
+ continue;
108
+ }
109
+
99
110
  additionalIndices.Add(i0);
100
111
  additionalIndices.Add(i3);
101
112
  additionalIndices.Add(i1);
@@ -193,7 +204,10 @@
193
204
  this.shadowVolume.AddComponent<MeshRenderer>().sharedMaterial = this.shadowMaterial;
194
205
  }
195
206
 
207
+ // Updateだと、このスクリプトがメッシュを更新した後で他のスクリプトによって
208
+ // オブジェクトの位置その他が書き換えられた場合にずれが生じてしまうため、
209
+ // LateUpdateを使うようにしてそうなる可能性を低減した
196
- private void Update()
210
+ private void LateUpdate()
197
211
  {
198
212
  if (this.lightTransform == null)
199
213
  {