10using System.Collections;
18 const int MAX_SIDES = 30;
19 const int TRIANGLE_INDICES_PER_QUAD = 6;
20 const int VERTICES_PER_QUAD = 4;
43 GetComponent<MeshFilter>().mesh =
new Mesh();
61 mesh_.RecalculateNormals();
66 CombineInstance[] combine =
new CombineInstance[2];
67 combine[0].mesh =
mesh_;
70 GetComponent<MeshFilter>().sharedMesh.CombineMeshes(combine,
true,
false);
71 GetComponent<MeshFilter>().sharedMesh.RecalculateBounds();
77 Destroy(GetComponent<MeshFilter>().mesh);
95 for (
int s = 0; s <
sides; ++s) {
97 joint_vertices_[s] = Quaternion.AngleAxis(angle, -Vector3.forward) * Vector3.up;
111 int vertex_index = 0;
114 Vector3 joint_position = transform.InverseTransformPoint(
GetJointPosition(i));
115 Vector3 next_joint_position = transform.InverseTransformPoint(
GetJointPosition(i + 1));
116 Quaternion joint_rotation = Quaternion.Inverse(transform.rotation) * (
GetJointRotation(i));
117 Quaternion next_joint_rotation = Quaternion.Inverse(transform.rotation) *
120 for (
int s = 0; s <
sides; ++s) {
121 int next_side = (s + 1) %
sides;
132 vertices_[vertex_index++] = joint_position + offset;
135 vertices_[vertex_index++] = joint_position + offset;
138 vertices_[vertex_index++] = next_joint_position + offset;
141 vertices_[vertex_index++] = next_joint_position + offset;
147 Vector3 base_position = transform.InverseTransformPoint(
GetJointPosition(0));
149 Quaternion base_rotation = Quaternion.Inverse(transform.rotation) *
GetJointRotation(0);
150 Quaternion tip_rotation = Quaternion.Inverse(transform.rotation) *
157 for (
int s = 0; s <
sides; ++s) {
168 int vertex_index = 0;
171 normals_ =
new Vector3[num_vertices];
172 Vector2[] uv =
new Vector2[num_vertices];
174 int triangle_index = 0;
175 int num_triangles = TRIANGLE_INDICES_PER_QUAD *
sides *
NUM_BONES;
176 int[] triangles =
new int[num_triangles];
179 for (
int s = 0; s <
sides; ++s) {
181 triangles[triangle_index++] = vertex_index;
182 triangles[triangle_index++] = vertex_index + 2;
183 triangles[triangle_index++] = vertex_index + 1;
185 triangles[triangle_index++] = vertex_index + 2;
186 triangles[triangle_index++] = vertex_index + 3;
187 triangles[triangle_index++] = vertex_index + 1;
189 uv[vertex_index] =
new Vector3((1.0f * s) /
sides, (1.0f * i) /
NUM_BONES);
190 uv[vertex_index + 1] =
new Vector3((1.0f + s) /
sides, (1.0f * i) /
NUM_BONES);
191 uv[vertex_index + 2] =
new Vector3((1.0f * s) /
sides, (1.0f + i) /
NUM_BONES);
192 uv[vertex_index + 3] =
new Vector3((1.0f + s) /
sides, (1.0f + i) /
NUM_BONES);
194 vertices_[vertex_index++] =
new Vector3(0, 0, 0);
195 vertices_[vertex_index++] =
new Vector3(0, 0, 0);
196 vertices_[vertex_index++] =
new Vector3(0, 0, 0);
197 vertices_[vertex_index++] =
new Vector3(0, 0, 0);
203 mesh_.triangles = triangles;
211 int num_vertices = 2 *
sides;
216 if (uv.Length != num_vertices)
217 Array.Resize(ref uv, num_vertices);
219 int triangle_index = 0;
221 int num_triangles = 2 * 3 * (
sides - 2);
222 if (num_triangles != triangles.Length)
223 Array.Resize(ref triangles, num_triangles);
225 for (
int i = 0; i <
sides; ++i) {
229 uv[i] +=
new Vector2(0.5f, 0.5f);
231 uv[i +
sides] +=
new Vector2(0.5f, 0.5f);
234 for (
int i = 0; i <
sides - 2; ++i) {
235 triangles[triangle_index++] = 0;
236 triangles[triangle_index++] = i + 1;
237 triangles[triangle_index++] = i + 2;
239 triangles[triangle_index++] =
sides;
240 triangles[triangle_index++] =
sides + i + 2;
241 triangles[triangle_index++] =
sides + i + 1;
Quaternion GetBoneRotation(int bone_type)
Vector3 GetJointPosition(int joint)
Vector3[] joint_vertices_
Quaternion GetJointRotation(int joint)
override void UpdateFinger()
override void InitFinger()