Java如何绘制圆锥,五、Unity 生成几种常用模型mesh-----ConeShape(圆锥体)

1、获得顶点的数据集合protected override Vector3[] GetVertices()

{

var points = new Vector3[_circularSideCount];//保存底面圆形的点集合

for (int i = 0; i < _circularSideCount; i++)

{

var rad = i * 1.0f / _circularSideCount * Mathf.PI * 2;

var cos = Mathf.Cos(rad) * _radius;

var sin = Mathf.Sin(rad) * _radius;

points[i] = new Vector3(cos, -_height * 0.5f, sin) - _verticeOffset;

}

int curIndex = 0;//当前索引

int arrayLen = (_circularSideCount + 1) * 3;//顶点数组的长度

var vertices = new Vector3[arrayLen];

//底面

vertices[curIndex++] = new Vector3(0, -_height * 0.5f, 0) - _verticeOffset;

for (int i = 0; i < _circularSideCount; i++)

{

vertices[curIndex++] = points[i];

}

//侧面

var topPoint = new Vector3(0, _height * 0.5f, 0) - _verticeOffset;//顶点的位置

for (int i = 0; i < _circularSideCount; i++)

{

vertices[curIndex++] = points[i];

vertices[curIndex++] = topPoint;

}

vertices[curIndex] = points[0];

vertices[curIndex++] = topPoint;

return vertices;

}

2、获得法线方向的数据集合protected override Vector3[] GetNormals()

{

int curIndex = 0;

int arrayLen = (_circularSideCount + 1) * 3;//法线数组的长度

var normals = new Vector3[arrayLen];

//底面

for (int i = 0; i <= _circularSideCount; i++)

{

normals[curIndex++] = Vector3.down;

}

//侧面

for (int i = 0; i <= _circularSideCount; i++)

{

var rad = i * 1.0f / _circularSideCount * Mathf.PI * 2;

var cos = Mathf.Cos(rad);

var sin = Mathf.Sin(rad);

normals[curIndex++] = new Vector3(cos, 0, sin);

normals[curIndex++] = new Vector3(cos, 0, sin);

}

return normals;

}

3、获得三角面顶点的索引protected override int[] GetTriangles()

{

int curIndex = 0;

int arrayLen = _circularSideCount * 3 + _circularSideCount * 3;//数组长度

var triangles = new int[arrayLen];

//底面

for (int i = 0; i < _circularSideCount - 1; i++)

{

triangles[curIndex++] = 0;

triangles[curIndex++] = i + 1;

triangles[curIndex++] = i + 2;

}

triangles[curIndex++] = 0;

triangles[curIndex++] = _circularSideCount;

triangles[curIndex++] = 1;

//侧面

int startIndex = _circularSideCount + 1;

for (int i = 0; i < (_circularSideCount - 1) * 2; i += 2)

{

triangles[curIndex++] = startIndex + i;

triangles[curIndex++] = startIndex + i + 1;

triangles[curIndex++] = startIndex + i + 2;

}

triangles[curIndex++] = startIndex + (_circularSideCount - 1) * 2;

triangles[curIndex++] = startIndex + (_circularSideCount - 1) * 2 + 1;

triangles[curIndex] = startIndex;

return triangles;

}

4、获得UV坐标的数据集合protected override Vector2[] GetUVs()

{

int curIndex = 0;

int arrayLen = (_circularSideCount + 1) * 3;

var uvs = new Vector2[arrayLen];

//底面

uvs[curIndex++] = new Vector2(0.5f, 0.5f);

for (int i = 0; i < _circularSideCount; i++)

{

var rad = i * 1.0f / _circularSideCount * Mathf.PI * 2;

var cos = Mathf.Cos(rad);

var sin = Mathf.Sin(rad);

uvs[curIndex++] = new Vector2(cos, sin);

}

//侧面

float value = 1.0f / _circularSideCount;

for (int i = 0; i <= _circularSideCount; i++)

{

uvs[curIndex++] = new Vector2(value * i, 0);

uvs[curIndex++] = new Vector2(value * i, 1);

}

return uvs;

}

效果如下:bVcPbXl

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值