我在threejs中有透明UV贴图的问题。当我在搅拌机中设置纹理时,我点击"渲染"一切都很好
但是当我通过JSONloader在threejs中加载模型时,PNG纹理下的黑色背景加载而不是blender的材质颜色。
如何在threejs中删除此黑色背景并使用blender材质?
这是我的代码
var scene, camera, renderer;
var guiControls, controls, stats, axis, lightHelper;
var sceneBackground;
var spotLight;
var cube, ground, toursKnot, text;
var groundMaterial, boxMaterial, torMaterial, textMaterial;
var groundGeometry, boxGeometry, torGeometry, textGeometry;
var SCREEN_WIDTH, SCREEN_HEIGHT;
var loader = new THREE.JSONLoader();
loader.load('models/CupME9.json', addModel);
function addModel(geometry, materials){
var material = new THREE.MeshFaceMaterial(materials);
model = new THREE.Mesh(geometry, material);
model.scale.set(1,1,1);
model.position.set(5,2,0);
model.castShadow = true;
scene.add(model);
}
function init(){
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, .1, 500);
renderer = new THREE.WebGLRenderer({antialias:true });
sceneBackground = renderer.setClearColor(0xdddddd);
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.shadowMap.enabled = true;
renderer.shadowMapSoft = true;
//Controls
controls = new THREE.OrbitControls(camera,renderer.domElement);
controls.addEventListener('change', render);
//add helpers
axis = new THREE.AxisHelper(10);
scene.add(axis);
//grid
color = new THREE.Color("rgb(255,0,0)");
lineColor = new THREE.Color(0x000000);
grid = new THREE.GridHelper(50,20,color,lineColor);
scene.add(grid);
//camera
camera.position.set(15,12,10);
camera.lookAt(scene.position);
guiControls = new function(){
this.rotationX = 0.0;
this.rotationY = 0.0;
this.rotationZ = 0.0;
this.lightX = 10;
this.lightY = 10;
this.lightZ = 15;
this.intensity = 1;
this.distance = 0;
this.angle = 1.570;
this.exponent = 0;
this.shadowCameraNear = 1;
this.shadowCameraFar = 100;
this.shadowCameraFov = 50;
this.shadowCameraVisible = true;
this.shadowMapWidth = 1024;
this.shadowMapHeigh = 1024;
this.shadowBias = 0;
this.shadowDarkness = 0.5;
this.target = 'cube';
}
//lights
var ambient = new THREE.AmbientLight(0x404040);
scene.add(ambient);
spotLight = new THREE.SpotLight(0xffffff);
spotLight.position.set(10,10,15);
spotLight.castShadow = true;
spotLight.shadow.camera.left = -500;
spotLight.shadow.camera.right = 500;
spotLight.shadow.camera.top = 500;
spotLight.shadow.camera.bottom = -500;
spotLight.intensity = guiControls.intensity;
spotLight.distance = guiControls.distance;
spotLight.shadow.bias = guiControls.shadowBias;
spotLight.shadow.camera.fov = guiControls.shadowCameraFov;
spotLight.shadow.camera.near = guiControls.shadowCameraNear;
spotLight.shadow.camera.far = guiControls.shadowCameraFar;
spotLight.shadow.camera.visible = guiControls.shadowCameraVisible;
spotLight.shadow.mapSize.width = guiControls.shadowMapWidth; // default is 512
spotLight.shadow.mapSize.height = guiControls.shadowMapHeigh;
spotLight.name = 'Spot light';
lightHelper = new THREE.CameraHelper( spotLight.shadow.camera )
scene.add(lightHelper);
scene.add(spotLight);
//Plane
groundGeometry = new THREE.BoxGeometry(40,0,40);
groundMaterial = new THREE.MeshPhongMaterial({
color: 0xa0adaf,
shininess: 150,
specular: 0xffffff,
flatShading : true
});
ground = new THREE.Mesh(groundGeometry, groundMaterial);
ground.castShadow = false;
ground.receiveShadow = true;
scene.add(ground);
var datGUI = new dat.GUI();
datGUI.add(guiControls, 'rotationX', 0, 1);
datGUI.add(guiControls, 'rotationY', 0, 1);
datGUI.add(guiControls, 'rotationZ', 0, 1);
datGUI.add(guiControls, 'lightX',-60,180);
datGUI.add(guiControls, 'lightY',0,180);
datGUI.add(guiControls, 'lightZ',-60,180);
datGUI.add(guiControls, 'target', ['cube', 'torusKnot','text']).onChange(function(){
if (guiControls.target == 'cube'){
spotLight.target = cube;
}
else if (guiControls.target == 'torusKnot'){
spotLight.target = toursKnot;
}
else if (guiControls.target == 'text'){
spotLight.target = text;
}
});
datGUI.add(guiControls, 'intensity', 0.01, 5).onChange(function(value){
spotLight.intensity = value;
});
datGUI.add(guiControls, 'distance', 0, 1000).onChange(function(value){
spotLight.distance = value;
});
datGUI.add(guiControls, 'angle', 0.001, 1.570).onChange(function(value){
spotLight.angle = value;
});
datGUI.add(guiControls, 'exponent', 0, 50).onChange(function(value){
spotLight.exponent = value;
});
datGUI.add(guiControls, 'shadowCameraNear', 0 , 100).name("Near").onChange(function(value){
spotLight.shadow.camera.near = value;
spotLight.shadow.camera.updateProjectionMatrix();
lightHelper.update();
});
datGUI.add(guiControls, 'shadowCameraFar', 0 , 100).name("Far").onChange(function(value){
spotLight.shadow.camera.far = value;
spotLight.shadow.camera.updateProjectionMatrix();
lightHelper.update();
});
datGUI.add(guiControls, 'shadowCameraFov', 0 , 100).name("Fov").onChange(function(value){
spotLight.shadow.camera.fov = value;
spotLight.shadow.camera.updateProjectionMatrix();
lightHelper.update();
});
datGUI.add(guiControls, 'shadowCameraVisible').onChange(function(value){
spotLight.shadow.camera.visible = value;
spotLight.shadow.camera.updateProjectionMatrix();
//lightHelper.update();
});
//datGUI.close();
datGUI.add(guiControls, 'shadowBias', 0 , 1).onChange(function(value){
spotLight.shadow.bias = value;
spotLight.shadow.camera.updateProjectionMatrix();
lightHelper.update();
});
/*datGUI.add(guiControls, 'shadowDarkness', 0 , 1).onChange(function(value){
spotLight.shadow.camera.darkness = value;
spotLight.shadow.camera.updateProjectionMatrix();
});*/
$("#webGL-container").append(renderer.domElement);
stats = new Stats();
stats.domElement.style.position = 'absolute';
stats.domElement.style.left = '0px';
stats.domElement.style.top = '0px';
$("#webGL-container").append(stats.domElement);
}
function render(){
spotLight.position.x = guiControls.lightX;
spotLight.position.y = guiControls.lightY;
spotLight.position.z = guiControls.lightZ;
}
function animate(){
requestAnimationFrame(animate);
render();
stats.update();
renderer.render(scene,camera);
}
init();
animate();
$(window).resize(function(){
SCREEN_WIDTH = window.innerWidth;
SCREEN_HEIGHT = window.innerHeight;
camera.aspect = SCREEN_WIDTH / SCREEN_HEIGHT;
camera.updateProjectionMatrix();
renderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
});
答案 0 :(得分:0)
我也会在这里发布我的解决方法,以防其他人遇到此问题(最初发布在Github上)。即使它在这种情况下不起作用(OP正在动态添加纹理并且需要单独设置背景纹理),但在任何情况下,您希望背景颜色与纹理混合,这应该有效。
解决方法:强>
最初在3DS Max中完成,但在任何支持UV展开的建模软件中都应该类似
。使用UV展开来映射模型。
将多边形映射到您希望纹理显示为正常的位置 - 也就是说,将模型设置为纹理看起来与上面的截图相似的点,纹理周围有黑条。
然后将所有其余多边形映射到纹理背景颜色的小块中。
无论如何,这可能是最好的做法,因为否则难以使模型其余部分的颜色与纹理的背景颜色混合