26.02.2013, 03:19
|
#3
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Simplex noise 2d 3d 4d
гексагон с 25% лишних точек.

using UnityEngine;
using System;
public class CreateHexagone : MonoBehaviour {
public int width=10;
// Use this for initialization
void Start () {
//ставлю точки
Vector3[] vert = new Vector3[(width+1)*(width+1)];
Vector3[] normals = new Vector3[(width+1)*(width+1)];
Vector2[] uv = new Vector2[(width+1)*(width+1)];
//синусокосинус 45 градусов
float cosin =(float)Math.Sqrt (Math.PI*0.25f);
for(int i = 0; i<=width; i++){
for( int j = 0; j<=width; j++){
//поворот на 45 градусов и сжатие по одной оси на корень из двух пока треугольник не станет правильным
float xCoor =(i-j)*cosin;
float zCoor =(i+j-width)*0.5f;
float yCoor = 0;
vert[i*(width+1)+j] = new Vector3(xCoor,yCoor,zCoor);
normals[i*(width+1)+j] = new Vector3(0,1,0);
uv[i*(width+1)+j] = new Vector2(xCoor,zCoor);
}}
//ставлю треугольники
int[] trians = new int[3*2*width*width];
int trianIndex =0;
for(int i = 0; i<width; i++){
for( int j = 0; j<width; j++){
int v0 = i*(width+1)+j;
int v1 = v0+1;
int v2 = v0+width+1;
int v3 = v2+1;
//прямая -x+y-0.5*width=0 и прямая -x+y+0.5*width=0
//точка (i,j)
//расстояние от прямой d = (-1*i + 1*j+0.5*width)/sqrt(2)
//так как нужен только знак то все проще
float d0 = -i+j+0.5f*width;
float d1 = -i+j-0.5f*width;
if(d0>=0 && d1<0){
trians[trianIndex+0]=v0;
trians[trianIndex+1]=v1;
trians[trianIndex+2]=v3;
trianIndex+=3;
}
if(d0>0 && d1<=0){
trians[trianIndex+0]=v0;
trians[trianIndex+1]=v3;
trians[trianIndex+2]=v2;
trianIndex+=3;
}
}}
gameObject.AddComponent("MeshFilter");
Mesh mesh = GetComponent<MeshFilter>().mesh;
mesh.Clear();
mesh.vertices = vert;
mesh.uv = uv;
mesh.triangles = trians;
mesh.normals = normals;
}
// Update is called once per frame
void Update () {
}
}
|
(Offline)
|
|