记一次three.js 布局3D室内简易地图

完整DEMO有需要可以下载,three.js json配置地图DEMO

随着html5 canvas的流行,酷炫的web端效果层出不穷,搭载基于webgl 的three.js的图形库可以做出基于web的3D效果。最近应对客户需求,2D平面地图已经不太满足客户的口味,3D的效果更让人接受,先看一下成果图。

对应室内地图CAD图纸 进行3D立体效果拉伸,再加上一些实景模型的搭配,使得整体效果更好。

地图地板墙体的依据cad 尺寸制定的json数据协议:

 {
        title: '',
        x: 480,
        y: 80,
        z: 0,
        width: 2,
        height: 866,
        color: "#30B2BB",
        textcolor: "black",
        bordercolor: "rgba(76, 181, 216, 0.85)",
        bspMesh: [

            // 小房子的墙
            {
                type: 'union',
                geometryType: 'box', color: '#fff',

                x: 0,
                y: 80,
                z: 82,
                width: 38,
                height: 2,
                positionY: 0,
            }]
}

3D坐标轴对应2D多了一个高度 ,这里高度设置为Y轴,2D.Y=>3D.Z  2D.X=>3D.X 。3D场景新增的几何体都是模型的中心在原点,而2D的原点是从屏幕左上角开始(0,0),所以这里需要一个转换,首先确认地图的最大长宽尺寸,然后通过计算得到2D坐标转换3D时基于地图的位置设置其position,

   data.x = data.width / 2 - MapXLength / 2 + data.x;

    data.z = data.height / 2 - MapZLength / 2 + data.z;

常规的地面墙面,以及柱子,墙面门通过,ThreeBSP库进行模型的组合,打孔,完成。

地图区域的说明通过DIV+css来完成,实时计算3D坐标系固定位置对于2D屏幕的位置来实现引导性的连接:

function worldPointToScreen(point) {
    let vec2 = point.project(camera);
    let halfWidth = window.innerWidth / 2;
    let halfHeight = window.innerHeight / 2;
    return {
        x: vec2.x * halfWidth + halfWidth,
        y: -vec2.y * halfHeight + halfHeight
    };
}

转换公式如上。

地图操作控制器是OrbitControls。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

11eleven

你的鼓励是我创作的动力 !

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值