现在有个需求就是要做个地图网格生成器,但是找到的资料却没什么用。所以,C3D怎么绘制地形的三角面或者正方形网格?
发一个我在编辑器里绘制网格的代码,可以参考一下~
public createGrid(effectName: string) {
const node = new cc.Node(effectName);
node.parent = cce.backgroundNode;
node.setWorldPosition(cc.v3(0, 0, 0));
const model = node.addComponent(cc.ModelComponent);
const positions = [];
const colors = [];
const indices = [];
// 直接创建一大块Mesh用的内存,方便后面动态加线
for (let i = 0; i < _maxTicks * _maxTicks; i++) {
positions.push(0, 0);
colors.push(1, 1, 1, 1);
}
for (let i = 0; i < positions.length; i += 2) {
indices.push(i / 2);
}
const primitiveMode = cc.GFXPrimitiveMode.LINE_LIST;
// 使用二维顶点来节省顶点数据
const attributes = [{
name: cc.GFXAttributeName.ATTR_POSITION,
format: cc.GFXFormat.RG32F,
}];
const mesh = cc.utils.createMesh({positions, indices, colors, primitiveMode, attributes});
model.mesh = mesh;
// for material
const mtl = new cc.Material();
mtl.initialize({ effectName, states: { primitive: primitiveMode } });
model.material = mtl;
return model;
}
1赞
更新帖子。。。。大佬给了个脚本:
@property({ type: Node })
public targerNode: Node = null;
@property({type: Material})
public mat: Material = null;
start(){
this.CreateGrid(‘editor/grid’);
}
/**
* 创建Mesh
* @param effectName 节点名
*/
public CreateGrid(effectName) {
const tempNode = new Node(effectName);
tempNode.parent = this.node;
tempNode.setWorldPosition(cc.v3(0, 0, 0));
const model = tempNode.addComponent(ModelComponent);
const positions = [];
const colors = [];
const indices = [];
const xLineNum = 10;
const zLineNum = 10;
const space = 1;
for (let i = 0; i < xLineNum; i++) {
positions.push(i*space, -1000);
positions.push(i*space, 1000);
}
for (let j = 0; j < zLineNum; j++) {
positions.push(-1000, j*space);
positions.push(1000, j*space);
}
for (let i = 0; i < positions.length; i += 2) {
indices.push(i / 2);
}
const primitiveMode = GFXPrimitiveMode.LINE_STRIP_ADJACENCY;
// 使用二维顶点来节省顶点数据
const attributes = [{
name: GFXAttributeName.ATTR_POSITION,
format: GFXFormat.RG32F,
}];
const mesh = utils.createMesh({positions, indices, colors, primitiveMode, attributes});
model.mesh = mesh;
model.material = this.mat;
return model;
}
接下来你必须指定下面这样一个材质,和一个空节点:
这里其实因为是要绘制平面网格,写的比较特殊,就只传了二维的坐标点,如果要画三维的线,就要传入三维的点,然后使用其它的effect,例如builtin-unlit。