three.js - Mapbox/threebox 在现有 3D 对象上更改比例不起作用
问题描述
首先,我对 Mapbox 有点陌生。我已经让一些有趣的事情正常工作,但这并不意味着我正在以正确/最好的方式做事。总是乐于学习如何把事情做得更好。
我正在尝试设置一个加载 3D 模型的页面,并在加载后为您提供屏幕控制以操纵 3D 模型。
我已经让 x/y/z 移动和旋转工作正常,但比例无法正常工作。我尝试了几种不同的方法(详见下文)并且规模没有改变。
我从这里的标准 Mapbox 3D 模型代码示例开始: https ://docs.mapbox.com/mapbox-gl-js/example/add-3d-model/
我从这里使用 jcastro76 的三盒叉: https ://github.com/jscastro76/threebox/
注意:无论初始模型var options
比例设置为多少,console.log/.dir 都会显示 0.0262049,但更改初始比例确实会影响模型的初始大小。这让我觉得我读错了比例,但没有任何比例设置尝试明显改变模型的比例。做一个 console.dir(defaultModel) 并查看属性,所有看起来与比例相关的东西也总是设置为 0.0262049,包括 matrix.elements 0/5/10,比例 x/y/z,
有什么想法/意见吗?提前致谢!
我正在使用的代码.... 添加 3D 对象:
map.addLayer({
id: 'custom_layer',
type: 'custom',
renderingMode: '3d',
onAdd: function (map, mbxContext) {
window.tb = new Threebox(
map,
mbxContext,
{
defaultLights: true,
enableSelectingObjects: true,
enableDraggingObjects: true,
enableRotatingObjects: true
}
);
var options = {
obj: 'model.glb',
type: 'gltf',
scale: 1, // I get 0.0262049 later regardless of what this is set to. Models with different initial scale set here work correctly, but still can't change it later
units: 'meters',
rotation: { x: 90, y: 0, z: 0 },
anchor: 'center'
}
tb.loadObj(options, function (model) {
defaultModel = model.setCoords(origin);
defaultModel.addEventListener('ObjectDragged', onDraggedObject, false);
tb.add(defaultModel);
})
},
render: function (gl, matrix) {
tb.update();
}
});
// 尝试 #1,scale.set
scale = defaultModel.scale;
console.log('Original scale:');
console.dir(scale);
x: 0.0262049 y: 0.0262049 z: 0.0262049
defaultModel.scale.set(1, 1, 1);
scale = defaultModel.scale;
console.log('New scale:');
console.dir(scale);
x: 0.0262049 y: 0.0262049 z: 0.0262049
我还以相同的前后结果尝试了所有这些:
defaultModel.matrix.makeScale(1, 1, 1);
defaultModel.setScale(1);
defaultModel.scale.x = 1;
defaultModel.scale.y = 1;
defaultModel.scale.z = 1;
defaultModel.matrix.scale(1);
defaultModel.matrix.scale(1, 1, 1);
我看到了使用 THREE.Vector3 对象的参考,所以我尝试了这个,结果相同:
var threeV3 = new THREE.Vector3(
1,
1, // also tried -1 on some
1
);
defaultModel.scale.set(threeV3);
defaultModel.matrix.makeScale(threeV3);
defaultModel.setScale(threeV3);
defaultModel.matrix.scale(threeV3);
解决方案
推荐阅读
- python - 将 **kwargs 传递给 django 过滤器时出现语法错误
- html - 自定义表格中的引导导航栏
- javascript - 变量汇总后将项目推送到数组
- jquery - 如何将 @html.ajaxgrid 与 ajax 调用绑定,并且一旦加载了网格,所以我想在 ajax 成功时发出警报(“已加载”)
- android - 在显示“应用程序没有响应”之前,您能否向 Android 指示等待时间或告诉它该应用程序仍处于“活动状态”?如果是,如何?
- css - Safari 位置:粘性在溢出中不起作用:自动元素
- .net - 接口需要返回任务的函数
- php - 如果销售价格等于零,则仅在 Woocommerce 中显示常规产品价格
- c# - 如何在两个命令之间暂停
- ios - iOS - 色彩空间 - UI 图像的金属纹理 - iPhone vs iPad 相机