2016-03-29 23 views
0

THREE.JSONLoader ile yüklenen bir nesneyi genel değişken olarak eklemenin mümkün olup olmadığını merak ediyordum? İdeal olarak, tüm yüklenen dokularım, malzeme oluşturma ve geometrinin kolay manipulasyon için komutumun en üstünde genel değişkenler olmasını isterim (güçlü 3D arka planım var ama js ve webGL'ye yeni). Ben kamuya açık bir şey bildirilen varsayıyorum - bir işlev için parametre olarak eklendikten sonra artık halka açık değil - bu durumda JSONLoader. Ancak, sadece bir var, değerini "çalışma" ilan etmeden adlandırma ama ben tuhaf THREE.min.js hatası alıyorum anlayamıyorum. Aşağıda benim kod yer verdik - Beni ne kadar kötü bildirmek için çekinmeyin - - bu bana stoolFrame yüklerken :)THEE.JSONLoader Genel değişken olarak nesne

//webGL 

var scene = new THREE.Scene(); 
var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000); 

camera.position.set(0, 16, 25); 
camera.rotation.x += -0.32; 

var renderer = new THREE.WebGLRenderer(); 
renderer.setSize(window.innerWidth, window.innerHeight); 
document.body.appendChild(renderer.domElement); 

cubeCamera = new THREE.CubeCamera(1, 1000, 256); // parameters: near, far, resolution 
cubeCamera.renderTarget.texture.minFilter = THREE.LinearMipMapLinearFilter; // mipmap filter 
scene.add(cubeCamera); 

///LOADERS 
var loadTexture = new THREE.TextureLoader(); 
var loaderJs = new THREE.JSONLoader(); 


///TEXTURES 
var skyTexture = loadTexture.load("textures/background.jpg"); 
var seatTexture = loadTexture.load("textures/abc_Diffuse.jpg"); 

///MATERIALS 
var skyMaterial = new THREE.MeshBasicMaterial({ 
    side: THREE.DoubleSide, 
    map: skyTexture 
}); 
var frameMaterial = new THREE.MeshLambertMaterial({ 
    //envMap: cubeCamera.renderTarget, 
    color: 0xffffff 
}); 
var seatMaterial = new THREE.MeshLambertMaterial({ 
     map: seatTexture 
}); 


///GEOMETRY and MESHES 
var frameGeo; 

var skyGeo = new THREE.SphereGeometry(30, 30, 30); 
var skySphere = new THREE.Mesh(skyGeo, skyMaterial); 
scene.add(skySphere); 

loaderJs.load("models/stoolFrame.js", function(){ 
    frameGeo = new THREE.Mesh(frameGeo, frameMaterial); 
    frameGeo.scale.set(.5, .5, .5); 
    barStool.add(frameGeo); 
}); 

loaderJs.load("models/stoolSeat.js", function (seatGeo){ 
    seatGeo = new THREE.Mesh(seatGeo, seatMaterial); 
    seatGeo.scale.set(.5, .5, .5); 
    barStool.add(seatGeo); 
}); 


var barStool = new THREE.Object3D(); 
scene.add(barStool); 

    var render = function() { 

     requestAnimationFrame(render); 
     barStool.rotation.y += 0.01; 

     frameGeo.visible = false; 
     cubeCamera.position.copy(frameGeo.position); 
     cubeCamera.updateCubeMap(renderer, scene); 
     frameGeo.visible = true; 


     renderer.render(scene, camera); 
    }; 



render(); 

cevap

0

, parametreleri eklemeyi unuttuğu öğrenmenize yardımcı olur başka sorunlar bulunuyor biliyorum Geri arama işlevi için documentation örneğini kontrol edin. Geriçağırım işlevi bir geometri ve bir malzeme alır. stoolSeat yüklerken Eğer malzeme içerisinde muhtelif (eğer dışkı için bir malzeme olması koşuluyla)

var frameGeometry; 
var frameMaterial; 
var frameMesh; 
loaderJs.load("models/stoolFrame.js", function (geometry, material){ 
    frameGeometry = geometry; 
    frameMaterial = material 
    frameMesh = new THREE.Mesh(frameGeometry, frameMaterial); 
    frameMesh.scale.set(.5, .5, .5); 
    barStool.add(frameMesh); 
}); 

Üstü geometri, malzemeyi yapmak ve küresel değişkenlere örgü nasıl bir örnektir unuttum. Ancak, muhtemelen geometriyi ve malzemeyi global vars olarak kaydetmeniz gerekmez (bunlara örgüden erişebilirsiniz: frameMesh.material; frameMesh.geometry).

Parametre adları, genel değişken adıyla aynıysa, javascript, erişmeye çalışırken global değişken yerine parametre değişkenini kullanır.

+0

Büyük yardımlar! frameMaterial = malzeme, eksik olduğum bulmacanın büyük bir anahtarıydı. –

+0

@ ab3d_work cevabınız, yaşadığınız problemi çözdüyse, lütfen cevabımın solundaki onay işaretine tıklayarak işaretleyin. – micnil

+0

Sadece biraz daha erken yaptım :) böylece malzeme = frameMaterial harika çalışıyor. Şimdi JSONLoader üzerinden yüklenen geometri üzerinde bir krom malzeme (cubeCamera kullanarak) oluşturmaya çalışıyorum. Küresel bir varyasyonda bildirilen geometrinin bir JSONLoader'daki global bir materyal kadar kolay olmadığını görüyorum. Global olması gerekiyor, bu yüzden render için cubeCamera'daki güncellemeyi arayabilirim. Herhangi bir fikir verebilirseniz, yine onun için büyük bir yardım olur! –

İlgili konular