2016-11-16 81 views
0

我試圖做一個現實的銀戒指這樣的:three.js所:物體的光與displacementMap

Desidered result

用不同的顏色和大小。

這是我在這一刻結果:

Result at this moment

正如你可以看到我的戒指並不順利。 我不知道這是否是模型的問題或代碼:

有我的模型(我用2模式,一個爲亮銀色,另一個是黑漆漆的一片)

這是我的代碼部分:

... 

scene = new THREE.Scene(); 

camera = new THREE.PerspectiveCamera(45, containerWidth/containerHeight, 0.1, 20000); 
scene.add(camera); 
camera.position.set(0, 150, 400); 
camera.lookAt(scene.position); 

renderer = new THREE.WebGLRenderer({antialias:true}); 
renderer.setClearColor(0xf0f0f0); 
renderer.setPixelRatio(window.devicePixelRatio); 
renderer.setSize(containerWidth, containerHeight); 

controls = new THREE.OrbitControls(camera, renderer.domElement); 
controls.enableZoom = false; 

var ambientlight = new THREE.AmbientLight(0xffffff); 
scene.add(ambientlight); 

var manager = new THREE.LoadingManager(); 
manager.onProgress = function (item, loaded, total) {}; 
var onProgress = function (xhr) {}; 
var onError = function (xhr) {}; 

var loader = new THREE.OBJLoader(manager); 
var textureLoader = new THREE.TextureLoader(manager); 

loader.load(path + '/assets/3d/anello-1/interno.obj', function (object) { 

    var backgroundTexture = textureLoader.load(path + '/assets/3d/texture/argento_standard_512_1024.jpg'); 

    backgroundTexture.flipY = false; 

    var background = new THREE.MeshPhongMaterial({ 
     map: backgroundTexture, 
     envMap: textureCube, 
     reflectivity:0.5 
    }); 

    object.traverse(function (child) { 
     if (child instanceof THREE.Mesh) { 
      child.material = background; 
     } 
    }); 

    object.position.y =-50; 
    scene.add(object); 

}, onProgress, onError); 


loader.load(path + '/assets/3d/anello-1/esterno.obj', function (object) { 

    var geometry = object.children[ 0 ].geometry; 
    var materials = []; 

    var scavoTexture = textureLoader.load(path + '/assets/3d/texture/argento_scuro_512_1024.jpg'); 


    var material = new THREE.MeshPhongMaterial({ 
     map: scavoTexture, 
     envMap: textureCube, 
     reflectivity:0.5 
    }); 

    materials.push(material); 

    var customTexture = textureLoader.load(path + "/" + immagine); 

    customTexture.flipY = false; 

    var custom = new THREE.MeshPhongMaterial({ 
     map: customTexture, 
     transparent: true, 
     opacity: 1, 
     color: 0xffffff 
    }); 

    materials.push(custom); 

    esterno = THREE.SceneUtils.createMultiMaterialObject(geometry, materials); 

    esterno.position.y=-50; 

    scene.add(esterno); 

}, onProgress, onError); 


container = document.getElementById('preview3d'); 

container.appendChild(renderer.domElement); 

animate(); 

我如何獲得更好的結果? 我必須改變我的模型?我的代碼?都? 感謝

[編輯]

謝謝大家的意見。 這是現在的結果是:

Ring with shade and textures

現在,我還有一個問題。有沒有辦法擠出文字和其他元素?我只有中央部分的PNG元素。

感謝

[編輯2]

現在我正在做一些實驗displacementMap。 這是在這一刻結果:

ring with displacement

現在的問題是:瀏覽器凍結,由於大量細分網格。 這是我的代碼的一部分:

var external = new THREE.CylinderBufferGeometry(3.48, 3.48, 4, 800, 400, true, -1.19, 5.54); 

var materials = []; 

var baseMaterial = new THREE.MeshPhongMaterial({ 
    color: 0x222222 
}); 

materials.push(baseMaterial); 

var textureMaterial = new THREE.MeshPhongMaterial({ 
    map: image, //PNG with text and symbols 
    transparent: true, 
    opacity: 1, 
    reflectivity:0.5, 
    color: 0xc0c0c0, 
    emissive: 0x111111, 
    specular: 0xffffff, 
    shininess: 34, 
    displacementMap: image, //same as map 
    displacementScale: 0.15, 
    displacementBias: 0 
}); 

materials.push(textureMaterial); 

var externalObj = THREE.SceneUtils.createMultiMaterialObject(external, materials); 

我認爲問題是氣缸的800x400段,即生成一個齧合320000「面」。有一種方法可以優化性能,保持這一級別的細節?

再次感謝。

P.s.也許我必須開一個新的問題?

+1

這個事做烏爾對象的多邊形數量。具有曲面的3D對象的平滑度在很大程度上由多邊形數決定。 – Mox

+1

您還需要查看反射(https://threejs.org/examples/webgl_materials_cubemap_balls_reflection.html)和凹凸貼圖(https://threejs.org/examples/webgl_materials_bumpmap.html)。這兩個紋理概念將有助於使環看起來更加逼真。 – TheJim01

+1

也許您需要將'shading:THREE.SmoothShading'添加到您的材質定義中。 – Brakebein

回答

1

回答你的新問題:你也可以使用你的PNG作爲位移圖。看看官方的例子:https://threejs.org/examples/webgl_materials_displacementmap.html 但是,你可能需要重新細分你的「中心部分」的位移。

也許在你的情況下,將你的PNG作爲凹凸貼圖足以,那麼你可能會看看這個例子:https://threejs.org/examples/webgl_materials_bumpmap.html

+0

謝謝!我已經測試了更換地圖,但爲了獲得好的效果,我必須將1000x500的細分區段和我的瀏覽器凍結細分爲黑暗柱面:D我將繼續進行位移和凹凸貼圖的實驗 –

+0

我會先嚐試凹凸貼圖做法。也許這已經足夠了。或者,您可以在您的3D程序中將文本實現爲額外的3d對象。 在這種情況下,具有尖銳邊緣的位移看起來總是有點奇怪,並導致較高的cpu/gpu負載。所以我會盡量避免流離失所。我忘了在我的回答中提到這一點。 – Brakebein

+0

我嘗試了凹凸貼圖方法,但這不足以滿足我的需求。我無法預先構建文本,因爲它是從Web圖像編輯器(基於canvas/fabricjs)建立的。 –