2016-11-16 4 views
0

나는이 같은 현실적인 실버 반지를 만들려고 노력 해요 :Three.js를 : 오브젝트 빛 & displacementMap

Desidered result

을 다양한 색상과 크기. 당신이 내 반지가 원활하지 않습니다 볼 수 있듯이

Result at this moment

:

이이 순간에 내 결과입니다. 그것은 또는 코드, 모델의 문제인지 나도 몰라 :

(전 2 모델, 빛은 하나의 어두운 한 또 다른을 사용하고 있습니다) 내 모델이 있습니다
  • 등 : http://www.websuvius.it/atma/myring/assets/3d/anello-1/interno.obj
  • 어두운 :

    ... 
    
    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(); 
    
    ,691,363 : http://www.websuvius.it/atma/myring/assets/3d/anello-1/esterno.obj

이 내 코드의 일부입니다210

더 나은 결과를 얻으려면 어떻게해야합니까? 내 모델을 변경해야합니까? 내 코드? 양자 모두? 감사

[편집]

감사 의견에 대한 여러분.

Ring with shade and textures

지금, 나는 또 다른 질문이 있습니다 : 이 이제 결과입니다. 텍스트 및 기타 요소를 돌출시키는 방법이 있습니까? 나는 중앙 부분의 png 요소 만 가지고있다.

감사

[EDIT 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); 

내가 문제 "에 직면"320000과 메쉬를 생성 실린더의 800x400 부분이라고 생각 : 이 내 코드의 일부이다. 이 수준의 세부 정보를 유지하면서 성능을 최적화하는 방법이 있습니까?

다시 한번 감사드립니다.

p.s. 어쩌면 새로운 질문을해야합니까?

+1

이 UR 오브젝트의 폴리곤 수를 할 수있는 뭔가가. 곡선 표면을 갖는 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

나는 범프 맵 접근법을 시도했지만, 내 필요에 충분하지 않습니다. 필자는 웹 이미지 편집기 (캔버스/fabricjs 기반)에서 dinamically 빌드되기 때문에 텍스트를 사전 빌드 할 수 없습니다. –