回答編集履歴
2
タプルを使わないコードに変更
answer
CHANGED
@@ -71,7 +71,7 @@
|
|
71
71
|
// 生えているようなものはダメ)メッシュなら、それぞれのエッジに対して
|
72
72
|
// 対応するパートナーが1本だけ見つかるはず
|
73
73
|
var tempEdgeList = edges.ToList();
|
74
|
-
var edgePairs = new List<
|
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(
|
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
|
93
|
+
foreach (var edgePair in edgePairs)
|
94
94
|
{
|
95
|
-
var i0 =
|
95
|
+
var i0 = edgePair.First.From.Index;
|
96
|
-
var i1 =
|
96
|
+
var i1 = edgePair.First.To.Index;
|
97
|
-
var i2 =
|
97
|
+
var i2 = edgePair.Second.From.Index;
|
98
|
-
var i3 =
|
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に変更
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
|
210
|
+
private void LateUpdate()
|
197
211
|
{
|
198
212
|
if (this.lightTransform == null)
|
199
213
|
{
|