4.3 场景和对象
场景库被设计用来控制场景画布以及其中的对象。
场景
这部分功能包括设置场景、添加查找对象和坐标转换工具。
根据opttab
中的选项设置场景。无返回值。选项列表:
- clear: 如果设置为 true,则清除场景中的所有对象。默认为 false。这可在脚本运行中使用,因为脚本开始运行时场景会被自动清理。
- camtype: 将相机设置为透视 ("persp") 或正交 ("ortho") 投影。默认为 "persp"。
- grid: 在xz平面 ("plane") 或单位球面上 ("sphere") 设置参考网格。默认为 "none"。
- bgcolor: 设置背景颜色。可使用颜色字符串如 "black" 或 "#000000"。默认为 "white"。
- rotspeed: 鼠标拖动旋转速度。默认为 1。
- transpeed: 鼠标拖动平移速度。默认为 1。
- near: 相机视锥近平面。默认为 2。
- far: 相机视锥远平面。默认为 3000。
以下是设置相机投影和背景颜色的示例代码:
scene.setenv({camtype='ortho', bgcolor='black'})
scene.addobj (type [, opttab])
将一个特定类型和选项的对象添加到场景的(0, 0, 0)位置。返回这个对象。类型包括:
- "points": 3D 离散点。使用以下选项: vertices, selectable, color, opacity, hcolor, size。
- "polyline": 3D 折线。使用以下选项: vertices, selectable, color, opacity, hcolor, size。
- "polygon": 2D 多边形,位于 xy 平面并朝 z(size) 方向挤压。使用以下选项: vertices, selectable, color, opacity, hcolor, size。
- "mesh": 网格。使用以下选项: vertices, selectable, color, opacity, hcolor。
- "box": 具有六个面的盒子。使用以下选项: width, height, length, selectable, color, opacity, hcolor。
- "sphere": 球体。使用以下选项: radius, segments, selectable, color, opacity, hcolor。
- "label": 始终朝向摄像机的文本标签。使用以下选项: text, font, selectable, color, opacity, hcolor, size。
- "light": 始终指向(0, 0, 0)的方向光。使用不透明度选项。
- ".json": Threejs JSON 文件。使用以下选项: selectable, hcolor。
- ".gltf": GLTF 文件。使用以下选项: selectable, hcolor。
- ".glb": GLB 文件。使用以下选项: selectable, hcolor。
- ".geojson": GeoJSON 文件。使用以下选项: selectable, color, opacity, hcolor。
opttab 中的选项列表:
- vertices: 一个数组,其中每三个数字代表一个三维点(x,y,z)。对于网格,每三个点组成一个三角形。法线遵循右手定则。默认为空。
- width: 以x轴测量的盒子宽度。默认为1。
- height: 以y轴测量的盒子高度。默认为1。
- length: 以z轴测量的盒子长度。默认为1。
- size: 厚度或宽度。默认为1。
- radius: 球体的半径。默认为1。
- segments: 对于球体网格的水平和1/2垂直分段。默认为32。
- selectable: 如果为true,则可以选择该对象。默认为true。
- color: 材质颜色,例如"red"或"#FF0000"。默认为"gray"。
- hcolor: 如果被选中则高亮显示的颜色。默认为"red"。
- opacity: 材质的透明度。默认为1。
- name: 一个字符串,稍后可以被scene.getobj使用。默认为""。
- text: 标签所使用的文本。默认为""。
- font: 标签所使用的字体。默认为"Arial"。
以下是向场景添加对象的一些示例:
scene.setenv({grid='plane'}) --设置一个平面网格
scene.addobj("points", {vertices={0,0,0, 5,5,5}, size=5}) --添加两个大小为5的点
scene.addobj("polyline", {vertices={0,0,0, -2,3,5, 4,6,7}, color='blue'}) --添加一个蓝色折线
scene.addobj("polygon", {vertices={-1,-1,0, -1,1,0, 1,1,0, 1,-1,0}, size=0}) --添加一个二维多边形
scene.addobj("label", {text="hello", size=5}) --添加一个标签
scene.render() --渲染场景
遍历场景,并返回第一个匹配名称的对象。相机和选定的对象可用"camera"和"selected"找到。
scene.tovector (radius, phi, theta)
从球坐标转换返回 x、y、z。
从向量返回球坐标:半径、phi、theta。
渲染场景并检查浏览器,类似于 os.getready,然后返回结果。可以通过 ms 参数控制渲染之间的间隔时间(毫秒)。
对象
这部分函数控制场景中的对象。请注意,调用 obj:func(args) 是 scene.func(obj, args) 的语法糖。
返回对象的位置:x、y、z。
设置对象的位置:x、y、z。如果对象是正交摄像机,则 z 也用作摄像机的缩放值。
返回对象的旋转(弧度):x、y、z。
设置对象的旋转(弧度):x、y、z。
返回对象的缩放:x、y、z。
设置对象的缩放:x、y、z。
获取所有子对象并将它们放入一个表作为返回值。
将表 childtab 中的所有对象设置为该对象的子对象。
返回对象的父级对象。
设置对象的父级对象。对象可以没有父对象。
获取对象的材质信息表。信息列表:
- type:材质类型字符串,比如"MeshBasicMaterial"。
- map:纹理ID号。
- color:颜色字符串,例如"red"、"rgb(250, 0,0)"、"rgb(100%,0%,0%)"、"hsl(0, 100%, 50%)"、"#FF0000"、"#f00"。
- opacity:表示材质透明度的数字。
从opttab中设置对象的材质。选项列表:
- type:材质类型字符串,比如"MeshBasicMaterial"。
- map:纹理ID号或图像文件路径或URL,例如"map.jpg"。
- color:颜色字符串,例如"red"或"#FF0000"。
- opacity:表示材质透明度的数字。
返回对象的几何体的顶点数组和索引数组(如果有)。
obj:setvertices (vertices [, indices])
设置对象的几何体的顶点数组和索引数组(如果有)。
返回存储对象的自定义数据的表格。请参考2.2 Searching for Countries获取示例代码。
将 datatab 中的 (key, value) 写入对象的自定义数据字段中。
将对象写入到指定路径的 Threejs JSON 文件中。
递归删除对象及其所有子对象。
本文使用ChatGPT翻译,如有遗漏请反馈。