前言
买房是人生大事,不仅要看户型,更要看采光。尤其是现在高层住宅密集,低楼层的日照时长往往是购房者的心病。虽然市面上有专业的日照分析软件,但对于普通开发者或购房者来说门槛太高。
最近利用周末时间,我开发了一套纯前端、零依赖的楼盘规划与采光模拟工具。它包含两个部分:
- 配置器 (Editor):基于 Canvas,在普通的楼盘规划图(JPG/PNG)上绘制楼栋轮廓、标定比例尺。
- 可视化 (Viewer):基于 Three.js,将配置好的数据生成 3D 模型,模拟冬至/夏至不同时间段的日照阴影。
本文将分享这个项目的核心技术实现思路。
🚀 功能演示
1. 2D 规划图配置器
这是数据生产的入口。用户上传一张总平图,通过'两点标定法'确定比例尺(例如:图上两点代表实际 50 米),然后就可以在图上通过点击绘制楼栋的多边形轮廓。
- 支持交互:滚轮缩放、右键平移、双击闭合多边形。
- 参数配置:可设置楼栋名称、层数、层高、每层户数等。
- 自动清洗:内置算法自动处理多边形绘制中的共线点、过近点。
2. 3D 采光可视化
将配置导出的 JSON 文件拖入查看器,即可生成 3D 场景。
- 日照模拟:支持冬至、夏至、春秋分切换,支持 06:00 - 18:00 连续时间拖动。
- 真实坐标:基于纬度计算太阳高度角和方位角。
- 可视化细节:根据户数自动生成简单的窗户纹理,支持只查看'本小区'模式。
🛠️ 核心技术实现
本项目完全由原生 HTML/CSS/JS 实现,3D 部分引入了 Three.js。
一、2D 编辑器:Canvas 交互与坐标变换
编辑器最核心的难点在于视图的缩放/平移与Canvas 坐标系之间的转换。
我们需要维护 viewScale (缩放倍率), viewX, viewY (偏移量)。在鼠标点击 Canvas 获取坐标时,必须将其逆变换回'图片原始坐标系',这样导出的数据才与缩放无关。
// 核心坐标转换函数
function getCanvasCoordinates(e) {
const rect = wrapper.getBoundingClientRect();
mouseXInWrapper = e. - rect.;
mouseYInWrapper = e. - rect.;
canvasX = (mouseXInWrapper - viewX) / viewScale;
canvasY = (mouseYInWrapper - viewY) / viewScale;
{ : canvasX, : canvasY };
}

