대칭적인 메쉬 만들기
16564 단어 polyhedronUnity
소개
Unity에서 스크립트에서 mesh를 만들어 대칭성이 있는 객체를 그리려고 한 비망록
환경: Unity 2020.3.12f1
대칭적인 물건 만들기
Quaternion으로 미리
축에 대해 대칭이되는 회전 시스템을 준비한다.
이것에, 중심으로부터 조금 떨어진 위치에 있는 좌표를 곱하는 것으로, 구면상의 어딘가의 점을 취하게 된다.
잘 안쪽 구와 외부 구의 크기와 각도를 조정하면
다면체나 별형 다면체 등의 대칭성이 있는 형태가 나타날 것.
흐름
우선 하나
삼각형 다각형을 그리며,
앞뒤로 미러하고
위아래로 미러하고
그리고, X축, Y축에 90도씩 비틀어진 형태로 회전하면서 복제하고 있습니다.
스크립트
MakePolyhedron.csusing System.Collections.Generic;
using UnityEngine;
public class MakePolyhedron : MonoBehaviour
{
// 3軸対象
readonly Quaternion[] _qs3S = {Quaternion.Euler(0, 0, 0), Quaternion.Euler(0, 90, 90), Quaternion.Euler(90, 0, 90)};
// 前後対象
readonly Quaternion[] _qfbs = {Quaternion.Euler(0, 0, 0), Quaternion.Euler(0, 180, 0)};
// 上下対象
readonly Quaternion[] _qtbts = {Quaternion.Euler(0, 0, 0), Quaternion.Euler(0, 0, 180)};
private readonly List<Vector3> _vertices = new List<Vector3>();
private Mesh _mesh;
private void Start()
{
GetComponent<Renderer>().material.SetColor("_Color",
new Color(Random.Range(0.25f, 0.85f), Random.Range(0.25f, 0.85f), Random.Range(0.25f, 0.85f)));
_mesh = new Mesh();
TriangleSetUp();
var meshFilter = GetComponent<MeshFilter>();
meshFilter.mesh = _mesh;
}
private void TriangleSetUp()
{
foreach (var qs3 in _qs3S)
{
foreach (var qfb in _qfbs)
{
foreach (var qtbt in _qtbts)
{
for (int i = 0; i < 3; i++)
{
// 頂点を用意
_vertices.Add(Quaternion.Euler(Random.Range(0, 45), Random.Range(0, 45), Random.Range(0, 45)) *
new Vector3(0, 1, 0));
}
}
}
}
// 頂点登録
_mesh.SetVertices(_vertices);
var triangles = new List<int>();
for (int i = 0; i < _vertices.Count; i++)
{
triangles.Add(i);
}
_mesh.SetTriangles(triangles, 0);
}
private void Update()
{
TriangleSeed(1 + Mathf.Sin(Time.timeSinceLevelLoad), 1, 45 + Mathf.Sin(Time.timeSinceLevelLoad) * 45);
_mesh.SetVertices(_vertices);
_mesh.RecalculateBounds();
_mesh.RecalculateNormals();
}
private void TriangleSeed(float l1, float l2, float fa)
{
var id = 0;
foreach (var qs3 in _qs3S)
{
foreach (var qfb in _qfbs)
{
foreach (var qtbt in _qtbts)
{
// 頂点を用意
_vertices[id++] = qtbt * qfb * qs3 * Quaternion.Euler(0, 0, 0) * new Vector3(0, l1, 0);
_vertices[id++] = qtbt * qfb * qs3 * Quaternion.Euler(90, fa, 0) * new Vector3(0, l2, 0);
_vertices[id++] = qtbt * qfb * qs3 * Quaternion.Euler(90, -fa, 0) * new Vector3(0, l2, 0);
}
}
}
}
}
메쉬 드로잉을 위한 구성 요소
MeshFilter와 MeshRenerer가 필요한 것 같습니다.
조금 복제하는 방법을 바꾸어 본다
// 前後対象 -> 4回回転対称
readonly Quaternion[] _qfbs = {Quaternion.Euler(0, 0, 0), Quaternion.Euler(0, 90, 0), Quaternion.Euler(0, 180, 0), Quaternion.Euler(0, 270, 0)};
Reference
이 문제에 관하여(대칭적인 메쉬 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tatmos/items/8708a897cac9822d91ed
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Quaternion으로 미리
축에 대해 대칭이되는 회전 시스템을 준비한다.
이것에, 중심으로부터 조금 떨어진 위치에 있는 좌표를 곱하는 것으로, 구면상의 어딘가의 점을 취하게 된다.
잘 안쪽 구와 외부 구의 크기와 각도를 조정하면
다면체나 별형 다면체 등의 대칭성이 있는 형태가 나타날 것.
흐름
우선 하나
삼각형 다각형을 그리며,
앞뒤로 미러하고
위아래로 미러하고
그리고, X축, Y축에 90도씩 비틀어진 형태로 회전하면서 복제하고 있습니다.
스크립트
MakePolyhedron.csusing System.Collections.Generic;
using UnityEngine;
public class MakePolyhedron : MonoBehaviour
{
// 3軸対象
readonly Quaternion[] _qs3S = {Quaternion.Euler(0, 0, 0), Quaternion.Euler(0, 90, 90), Quaternion.Euler(90, 0, 90)};
// 前後対象
readonly Quaternion[] _qfbs = {Quaternion.Euler(0, 0, 0), Quaternion.Euler(0, 180, 0)};
// 上下対象
readonly Quaternion[] _qtbts = {Quaternion.Euler(0, 0, 0), Quaternion.Euler(0, 0, 180)};
private readonly List<Vector3> _vertices = new List<Vector3>();
private Mesh _mesh;
private void Start()
{
GetComponent<Renderer>().material.SetColor("_Color",
new Color(Random.Range(0.25f, 0.85f), Random.Range(0.25f, 0.85f), Random.Range(0.25f, 0.85f)));
_mesh = new Mesh();
TriangleSetUp();
var meshFilter = GetComponent<MeshFilter>();
meshFilter.mesh = _mesh;
}
private void TriangleSetUp()
{
foreach (var qs3 in _qs3S)
{
foreach (var qfb in _qfbs)
{
foreach (var qtbt in _qtbts)
{
for (int i = 0; i < 3; i++)
{
// 頂点を用意
_vertices.Add(Quaternion.Euler(Random.Range(0, 45), Random.Range(0, 45), Random.Range(0, 45)) *
new Vector3(0, 1, 0));
}
}
}
}
// 頂点登録
_mesh.SetVertices(_vertices);
var triangles = new List<int>();
for (int i = 0; i < _vertices.Count; i++)
{
triangles.Add(i);
}
_mesh.SetTriangles(triangles, 0);
}
private void Update()
{
TriangleSeed(1 + Mathf.Sin(Time.timeSinceLevelLoad), 1, 45 + Mathf.Sin(Time.timeSinceLevelLoad) * 45);
_mesh.SetVertices(_vertices);
_mesh.RecalculateBounds();
_mesh.RecalculateNormals();
}
private void TriangleSeed(float l1, float l2, float fa)
{
var id = 0;
foreach (var qs3 in _qs3S)
{
foreach (var qfb in _qfbs)
{
foreach (var qtbt in _qtbts)
{
// 頂点を用意
_vertices[id++] = qtbt * qfb * qs3 * Quaternion.Euler(0, 0, 0) * new Vector3(0, l1, 0);
_vertices[id++] = qtbt * qfb * qs3 * Quaternion.Euler(90, fa, 0) * new Vector3(0, l2, 0);
_vertices[id++] = qtbt * qfb * qs3 * Quaternion.Euler(90, -fa, 0) * new Vector3(0, l2, 0);
}
}
}
}
}
메쉬 드로잉을 위한 구성 요소
MeshFilter와 MeshRenerer가 필요한 것 같습니다.
조금 복제하는 방법을 바꾸어 본다
// 前後対象 -> 4回回転対称
readonly Quaternion[] _qfbs = {Quaternion.Euler(0, 0, 0), Quaternion.Euler(0, 90, 0), Quaternion.Euler(0, 180, 0), Quaternion.Euler(0, 270, 0)};
Reference
이 문제에 관하여(대칭적인 메쉬 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tatmos/items/8708a897cac9822d91ed
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
MakePolyhedron.cs
using System.Collections.Generic;
using UnityEngine;
public class MakePolyhedron : MonoBehaviour
{
// 3軸対象
readonly Quaternion[] _qs3S = {Quaternion.Euler(0, 0, 0), Quaternion.Euler(0, 90, 90), Quaternion.Euler(90, 0, 90)};
// 前後対象
readonly Quaternion[] _qfbs = {Quaternion.Euler(0, 0, 0), Quaternion.Euler(0, 180, 0)};
// 上下対象
readonly Quaternion[] _qtbts = {Quaternion.Euler(0, 0, 0), Quaternion.Euler(0, 0, 180)};
private readonly List<Vector3> _vertices = new List<Vector3>();
private Mesh _mesh;
private void Start()
{
GetComponent<Renderer>().material.SetColor("_Color",
new Color(Random.Range(0.25f, 0.85f), Random.Range(0.25f, 0.85f), Random.Range(0.25f, 0.85f)));
_mesh = new Mesh();
TriangleSetUp();
var meshFilter = GetComponent<MeshFilter>();
meshFilter.mesh = _mesh;
}
private void TriangleSetUp()
{
foreach (var qs3 in _qs3S)
{
foreach (var qfb in _qfbs)
{
foreach (var qtbt in _qtbts)
{
for (int i = 0; i < 3; i++)
{
// 頂点を用意
_vertices.Add(Quaternion.Euler(Random.Range(0, 45), Random.Range(0, 45), Random.Range(0, 45)) *
new Vector3(0, 1, 0));
}
}
}
}
// 頂点登録
_mesh.SetVertices(_vertices);
var triangles = new List<int>();
for (int i = 0; i < _vertices.Count; i++)
{
triangles.Add(i);
}
_mesh.SetTriangles(triangles, 0);
}
private void Update()
{
TriangleSeed(1 + Mathf.Sin(Time.timeSinceLevelLoad), 1, 45 + Mathf.Sin(Time.timeSinceLevelLoad) * 45);
_mesh.SetVertices(_vertices);
_mesh.RecalculateBounds();
_mesh.RecalculateNormals();
}
private void TriangleSeed(float l1, float l2, float fa)
{
var id = 0;
foreach (var qs3 in _qs3S)
{
foreach (var qfb in _qfbs)
{
foreach (var qtbt in _qtbts)
{
// 頂点を用意
_vertices[id++] = qtbt * qfb * qs3 * Quaternion.Euler(0, 0, 0) * new Vector3(0, l1, 0);
_vertices[id++] = qtbt * qfb * qs3 * Quaternion.Euler(90, fa, 0) * new Vector3(0, l2, 0);
_vertices[id++] = qtbt * qfb * qs3 * Quaternion.Euler(90, -fa, 0) * new Vector3(0, l2, 0);
}
}
}
}
}
메쉬 드로잉을 위한 구성 요소
MeshFilter와 MeshRenerer가 필요한 것 같습니다.
조금 복제하는 방법을 바꾸어 본다
// 前後対象 -> 4回回転対称
readonly Quaternion[] _qfbs = {Quaternion.Euler(0, 0, 0), Quaternion.Euler(0, 90, 0), Quaternion.Euler(0, 180, 0), Quaternion.Euler(0, 270, 0)};
Reference
이 문제에 관하여(대칭적인 메쉬 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tatmos/items/8708a897cac9822d91ed
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
// 前後対象 -> 4回回転対称
readonly Quaternion[] _qfbs = {Quaternion.Euler(0, 0, 0), Quaternion.Euler(0, 90, 0), Quaternion.Euler(0, 180, 0), Quaternion.Euler(0, 270, 0)};
Reference
이 문제에 관하여(대칭적인 메쉬 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tatmos/items/8708a897cac9822d91ed텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)