关于地形网格绘制的问题。

现在有个需求就是要做个地图网格生成器,但是找到的资料却没什么用。所以,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。