three.js - threejs - 移动由单个函数的 2 次调用创建的 2 个球体
问题描述
我是threejs的初学者,但是:我有一个功能
function createSphere(
sphere_name,
radius,
wSegments,
hSegments,
surface_map,
xPos,
yPos,
zPos
) {
// START ----
let geometry1 = new THREE.SphereGeometry(radius, wSegments, hSegments);
let material1 = new THREE.MeshLambertMaterial({ map: surface_map });
center = new THREE.Mesh(geometry1, material1);
center.position.x = xPos;
center.position.y = yPos;
center.position.z = zPos;
let materialsToMap = 1;
for (let i = 10; i < 630; i += 62.8) {
for (let k = 70; k < 215; k += 45) {
let j = i / 100;
let l = k / 100;
let geometry = new THREE.SphereGeometry(radius, 16, 16, j, 0.62, l, 0.44);
let material = new THREE.MeshLambertMaterial({
map: materiale[materialsToMap],
transparent: true,
opacity: 0.8,
});
mesh_felii = new THREE.Mesh(geometry, material);
mesh_felii.position.x = center.position.x;
mesh_felii.position.y = center.position.y;
mesh_felii.position.z = center.position.z;
mesh_felii.userData = linkuri[materialeDeAratat];
mesh_felii.layers.set(1);
scene.add(mesh_felii);
materialeDeAratat++;
if (materialeDeAratat >= materiale.length) materialeDeAratat = 1;
}
}
//FINISH ----- aici am creat fasiile
scene.add(center);
}
我在我的脚本中用不同的 x 坐标调用它 2 次,所以我得到了 2 个球体,它们之间有一个距离。现在我想使用滑块将其中一个球体移动到场景中的新点。所以我读取了滑块值并将其添加到 center.position.x
我如何告诉我的脚本我想移动哪个球体?我发现无法在创建的 2 个球体之间进行识别。现在它只移动我第二次调用该函数时添加的球体
解决方案
据我了解,其目的是center
作为包含嵌套球体层/“切片”的“父”对象。
如果是这种情况,请记住两者center
并mesh_felii
添加到场景中。也许目的是将每个新mesh_felii
实例嵌套到center
所以当center
改变位置时这样做mesh_felii
吗?
此外,您的函数目前不返回任何内容。你可以很容易地改变它,让它返回center
。一旦你将每个新的存储center
在一个单独的变量中,你应该能够独立地移动它们。
(sphere_name
没有使用该参数,但这是一个小细节)
我会建议一些类似的东西:
function createSphere(
sphere_name,
radius,
wSegments,
hSegments,
surface_map,
xPos,
yPos,
zPos
) {
// START ----
let geometry1 = new THREE.SphereGeometry(radius, wSegments, hSegments);
let material1 = new THREE.MeshLambertMaterial({ map: surface_map });
let center = new THREE.Mesh(geometry1, material1);
center.position.x = xPos;
center.position.y = yPos;
center.position.z = zPos;
// seteaza nume (util pt. cautari)
center.name = sphere_name;
let materialsToMap = 1;
for (let i = 10; i < 630; i += 62.8) {
for (let k = 70; k < 215; k += 45) {
let j = i / 100;
let l = k / 100;
let geometry = new THREE.SphereGeometry(radius, 16, 16, j, 0.62, l, 0.44);
let material = new THREE.MeshLambertMaterial({
map: materiale[materialsToMap],
transparent: true,
opacity: 0.8,
});
let mesh_felii = new THREE.Mesh(geometry, material);
mesh_felii.position.x = center.position.x;
mesh_felii.position.y = center.position.y;
mesh_felii.position.z = center.position.z;
mesh_felii.userData = linkuri[materialeDeAratat];
mesh_felii.layers.set(1);
center.add(mesh_felii);
materialeDeAratat++;
if (materialeDeAratat >= materiale.length) materialeDeAratat = 1;
}
}
//FINISH ----- aici am creat fasiile
scene.add(center);
// returneaza sfera center (pivot-ul feliilor)
return center;
}
// test
let sphere1 = createSphere("sphere1", 10, 16, 16, yourSurfaceMapInstance, 0, 0, 0);
let sphere2 = createSphere("sphere2", 10, 16, 16, yourSurfaceMapInstance, 0, 0, 0);
// move spheres
sphere1.position.x = -15;
sphere2.position.x = 15;
请记住,此函数依赖于一些全局变量,并且有一些变量似乎具有类似的功能:
materialsToMap
用作数组索引materialeDeAratat
也用作数组索引,但它也被递增并重置为 1 而materialsToMap
不是。
嵌套的球体结构让我想起了裁剪交集的例子。
推荐阅读
- c# - 将“SafeHandle”用于 C API,包括引用计数
- typescript - 返回量角器“element.all”的函数具有输出类型 Promise
而不是承诺 在打字稿中 - dialogflow-es - Dialogflow 检测意图并返回多个意图名称和置信度值
- python-3.x - 保留字典中不在列表中的值
- excel - 如何在excel中的两个valor之间求和?
- javascript - Vue 在 Axios API 调用中将布尔值从 true 更改为 false
- python - 从标签内的网页中提取公司名称
- powershell - 如何在 Pester 中“获取调用的参数”(或生成包含实际值和预期值的有用消息)?
- php - 如何在 symfony 3 中使用相对路径
- azure-active-directory - 向托管标识授予 O365 管理 API 权限