这段代码显示了一个3D文件(obj,stl,3mf),所有工作正常,但我尝试了一些(在此代码中)添加OrbitControls,以便用户可以对文件进行放大、缩小、旋转等操作,但它似乎不起作用。控制台除了旋转、放大和缩小之外,没有任何错误。等等,在渲染时效果不佳。
<input type="file" name="file" id="file" onchange="loadFile(event)" />
<div id="filePreview" style="width: 100%; height: 30vh"></div>
<script>
var loadFile = function (event) {
let oInput = document.getElementById("file");
var _validFileExtensions = [".obj", ".stl", ".3mf"];
function ValidateSingleInput() {
if (oInput.type == "file") {
var sFileName = oInput.value;
if (sFileName.length > 0) {
var blnValid = false;
for (var j = 0; j < _validFileExtensions.length; j++) {
var sCurExtension = _validFileExtensions[j];
if (
sFileName
.substr(
sFileName.length - sCurExtension.length,
sCurExtension.length
)
.toLowerCase() == sCurExtension.toLowerCase()
) {
window.fileUrl = URL.createObjectURL(event.target.files[0]);
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
);
var renderer = new THREE.WebGLRenderer();
const controls = new THREE.OrbitControls( camera, renderer.domElement, scene );
camera.position.z = 200;
controls.update();
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(
45,
window.innerWidth / window.innerHeight,
1,
2000
);
camera.position.z = 250;
camera.lookAt(scene.position);
controls.update();
var directionalLight = new THREE.DirectionalLight(0xffeedd);
directionalLight.position.set(0, 0, 1).normalize();
scene.add(directionalLight);
var mesh = null;
if (sCurExtension == ".obj") {
var objLoader = new THREE.OBJLoader();
objLoader.load(window.fileUrl, function (object) {
mesh = object;
mesh.position.y = -50;
scene.add(mesh);
});
} else if (sCurExtension == ".3mf") {
var loader = new THREE.ThreeMFLoader();
loader.load(window.fileUrl, function (object) {
mesh = object;
mesh.position.y = -50;
scene.add(mesh);
});
} else if (sCurExtension == ".stl") {
var loader = new THREE.STLLoader();
loader.load(window.fileUrl, function (geometry) {
var material = new THREE.MeshPhongMaterial({
specular: 0x111111,
shininess: 200,
shading: THREE.FlatShading,
});
mesh = new THREE.Mesh(geometry, material);
mesh.position.y = -50;
scene.add(mesh);
});
}
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(
filePreview.offsetWidth,
filePreview.offsetHeight
);
renderer.setClearColor(0x000000);
document.body.appendChild(renderer.domElement);
animate();
function animate() {
requestAnimationFrame(animate);
controls.update();
renderer.render(scene, camera);
}
filePreview.appendChild(renderer.domElement);
blnValid = true;
break;
}
}
if (!blnValid) {
alert(
"Sorry, " +
sFileName +
" is invalid, allowed extensions are: " +
_validFileExtensions.join(", ")
);
oInput.value = "";
return false;
}
}
}
return true;
}
ValidateSingleInput();
};
</script>
<script src="http://threejs.org/build/three.min.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>
<script src="https://threejs.org/examples/js/loaders/3MFLoader.js"></script>
<script src="https://threejs.org/examples/js/loaders/OBJLoader.js"></script>
<script src="https://threejs.org/examples/js/loaders/STLLoader.js"></script>
有谁能检查一下代码,告诉我为什么它不工作,以及如何修复它?
2条答案
按热度按时间00jrzges1#
OrbitControls
不直接作为Three.js库的一部分导出;而是作为examples
的一部分导出。如果您使用的是捆绑包(如WebPack),则可以按如下方式导入:
或者,如果您使用脚本导入,则可以使用以下命令:
第一次
然后您可以这样使用它:
u3r8eeie2#
来自文档: