Javascript 通过着色器材质访问变形目标
我在中使用它并加载了一个带有变形目标的人体对象 但是我在通过web应用程序访问它时遇到了一个问题,因为它使用Javascript 通过着色器材质访问变形目标,javascript,three.js,morphing,Javascript,Three.js,Morphing,我在中使用它并加载了一个带有变形目标的人体对象 但是我在通过web应用程序访问它时遇到了一个问题,因为它使用ShaderMaterial。尽管ShaderMaterial具有morphTarget属性,morphTarget:true不工作 这是我的密码 <body> <div id="info"> </div> <script src="js/three.js"></script> <scri
ShaderMaterial
。尽管ShaderMaterial
具有morphTarget
属性,morphTarget:true代码>不工作
这是我的密码
<body>
<div id="info">
</div>
<script src="js/three.js"></script>
<script src="js/ShaderSkin.js"></script>
<script src="js/CopyShader.js"></script>
<script src="js/EffectComposer.js"></script>
<script src="js/RenderPass.js"></script>
<script src="js/ShaderPass.js"></script>
<script src="js/MaskPass.js"></script>
<script src="js/Detector.js"></script>
<script src="js/stats.min.js"></script>
<script src="js/AssimpJSONLoader.js"></script>
<script src="js/dat.gui.min.js"></script>
<script src="js/OrbitControls.js"></script>
<script>
if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
var statsEnabled = true;
var container, stats, loader;
var camera, scene, renderer;
var mesh, mesh2, gui;
var directionalLight;
var mouseX = 0;
var mouseY = 0;
var targetX = 0, targetY = 0;
var character,object;
var windowHalfX = window.innerWidth / 2;
var windowHalfY = window.innerHeight / 2;
var mapColor, mapHeight, mapSpecular;
var firstPass = true;
var composer, composerBeckmann;
var controls;
init();
animate();
function init() {
container = document.createElement( 'div' );
document.body.appendChild( container );
//
camera = new THREE.PerspectiveCamera( 27, window.innerWidth / window.innerHeight, 1, 10000 );
camera.position.z = 600;
camera.position.y = -20;
scene = new THREE.Scene();
scene.background = new THREE.Color( 0xffffff );
// LIGHTS
scene.add( new THREE.AmbientLight( 0x333344 ) );
directionalLight = new THREE.DirectionalLight( 0xffffff, 1 );
directionalLight.position.set( 500, 0, 500 );
directionalLight.castShadow = true;
directionalLight.shadow.mapSize.width = 2048;
directionalLight.shadow.mapSize.height = 2048;
directionalLight.shadow.camera.near = 200;
directionalLight.shadow.camera.far = 1500;
directionalLight.shadow.camera.left = -500;
directionalLight.shadow.camera.right = 500;
directionalLight.shadow.camera.top = 500;
directionalLight.shadow.camera.bottom = -500;
directionalLight.shadow.bias = -0.005;
scene.add( directionalLight );
//access morph targets
gui = new dat.GUI();
var params = {
Height: 0
};
var folder = gui.addFolder( 'Morph Targets' );
folder.add( params, 'Height', 0.0, 1.0 ).step( 0.01 ).onChange( function( value ) { object.morphTargetInfluences[ 1 ] = value; } );
folder.open();
// load the object
loader = new THREE.JSONLoader();
loader.load( 'leeperrysmith/MorphMan1.json', function ( geometry ) {
object = new THREE.Mesh( geometry );
createScene( geometry , 120)
} );
//
renderer = new THREE.WebGLRenderer( { antialias: true } );
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize( window.innerWidth, window.innerHeight );
container.appendChild( renderer.domElement );
renderer.shadowMap.enabled = true;
renderer.shadowMap.renderReverseSided = false;
renderer.autoClear = false;
//
renderer.gammaInput = true;
renderer.gammaOutput = true;
//
if ( statsEnabled ) {
stats = new Stats();
container.appendChild( stats.dom );
}
// COMPOSER
renderer.autoClear = false;
// BECKMANN
var effectBeckmann = new THREE.ShaderPass( THREE.ShaderSkin[ "beckmann" ] );
var effectCopy = new THREE.ShaderPass( THREE.CopyShader );
effectCopy.renderToScreen = true;
var pars = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBuffer: false };
var rtwidth = 512, rtheight = 512;
composerBeckmann = new THREE.EffectComposer( renderer, new THREE.WebGLRenderTarget( rtwidth, rtheight, pars ) );
composerBeckmann.addPass( effectBeckmann );
composerBeckmann.addPass( effectCopy );
// EVENTS
//document.addEventListener( 'mousemove', onDocumentMouseMove, true);
window.addEventListener( 'resize', onWindowResize, true );
controls = new THREE.OrbitControls( camera, renderer.domElement );
controls.addEventListener( 'change', render ); // remove when using animation loop
controls.enableZoom = true;
}
function createScene( geometry, scale ) {
var textureLoader = new THREE.TextureLoader();
// bump Map
var mapHeight = textureLoader.load( "leeperrysmith/3d_skin_texture_bump_map_by_degrahuma_stock.jpg" );
mapHeight.anisotropy = 4;
mapHeight.wrapS = mapHeight.wrapT = THREE.RepeatWrapping;
mapHeight.format = THREE.RGBFormat;
var mapSpecular = textureLoader.load( "leeperrysmith/3d_skin_texture_bump_map_by_degrahuma_stock.jpg" );
mapSpecular.anisotropy = 4;
mapSpecular.wrapS = mapSpecular.wrapT = THREE.RepeatWrapping;
mapSpecular.format = THREE.RGBFormat;
// skin texture
var mapColor = textureLoader.load( "leeperrysmith/middleage_lightskinned_male_diffuse2.png" );
mapColor.anisotropy = 4;
mapColor.wrapS = mapColor.wrapT = THREE.RepeatWrapping;
mapColor.format = THREE.RGBFormat;
var shader = THREE.ShaderSkin[ "skinSimple" ];
var fragmentShader = shader.fragmentShader;
var vertexShader = shader.vertexShader;
var uniforms = THREE.UniformsUtils.clone( shader.uniforms );
uniforms[ "enableBump" ].value = true;
uniforms[ "enableSpecular" ].value = true;
uniforms[ "tBeckmann" ].value = composerBeckmann.renderTarget1.texture;
uniforms[ "tDiffuse" ].value = mapColor;
uniforms[ "bumpMap" ].value = mapHeight;
uniforms[ "specularMap" ].value = mapSpecular;
uniforms[ "diffuse" ].value.setHex( 0xffffff );
uniforms[ "specular" ].value.setHex( 0xffffff );
//uniforms[ "specular" ].value.setHex( 0xa0a0a0 );
uniforms[ "uRoughness" ].value = 0.2;
uniforms[ "uSpecularBrightness" ].value = 1;
// change the bump scale
uniforms[ "bumpScale" ].value = 0.5;
var material = new THREE.ShaderMaterial( {
fragmentShader: fragmentShader,
vertexShader: vertexShader,
uniforms: uniforms,
lights: true,
morphTargets: true,
//morphNormals: true,
} );
material.extensions.derivatives = true;
mesh = new THREE.Mesh( geometry, material);
mesh.position.y = - 50;
mesh.scale.set( scale, scale, scale );
mesh.castShadow = true;
mesh.receiveShadow = true;
scene.add( mesh);//, mesh2 );
}
//
function onWindowResize( event ) {
windowHalfX = window.innerWidth / 2;
windowHalfY = window.innerHeight / 2;
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize( window.innerWidth, window.innerHeight );
}
function onDocumentMouseMove( event ) {
mouseX = ( event.clientX - windowHalfX ) * 1;
mouseY = ( event.clientY - windowHalfY ) * 1;
}
//
function animate() {
requestAnimationFrame( animate );
controls.update();
render();
if ( statsEnabled ) stats.update();
}
function render() {
targetX = mouseX * .001;
targetY = mouseY * .001;
if ( mesh ) {
mesh.rotation.y += 0.05 * ( targetX - mesh.rotation.y );
mesh.rotation.x += 0.05 * ( targetY - mesh.rotation.x );
}
if ( firstPass ) {
composerBeckmann.render();
firstPass = false;
}
renderer.clear();
renderer.render( scene, camera );
}
</script>
</body>
如果(!Detector.webgl)Detector.addGetWebGLMessage();
var statsEnabled=true;
var容器、stats、loader;
摄像机、场景、渲染器;
var-mesh,mesh2,gui;
方向光;
var-mouseX=0;
var-mouseY=0;
var targetX=0,targetY=0;
var特征、对象;
var windowHalfX=window.innerWidth/2;
var windowHalfY=window.innerHeight/2;
var mapColor、mapHeight、mapSpecular;
var firstPass=true;
作曲家,作曲家贝克曼;
风险值控制;
init();
制作动画();
函数init(){
container=document.createElement('div');
文件.正文.附件(容器);
//
摄像头=新的三个透视摄像头(27,window.innerWidth/window.innerHeight,11000);
摄像机位置z=600;
摄像机位置y=-20;
场景=新的三个。场景();
scene.background=新的三种颜色(0xffffff);
//灯光
添加(新的3.AmbientLight(0x333344));
方向光=新的三个方向光(0xffffff,1);
方向灯。位置。设置(500,0500);
directionalLight.castShadow=真;
directionalLight.shadow.mapSize.width=2048;
directionalLight.shadow.mapSize.height=2048;
directionalLight.shadow.camera.near=200;
directionalLight.shadow.camera.far=1500;
directionalLight.shadow.camera.left=-500;
directionalLight.shadow.camera.right=500;
directionalLight.shadow.camera.top=500;
directionalLight.shadow.camera.bottom=-500;
方向光.shadow.bias=-0.005;
场景。添加(方向光);
//访问变形目标
gui=新的dat.gui();
var params={
身高:0
};
var folder=gui.addFolder('Morph Targets');
add(参数'Height',0.0,1.0).step(0.01).onChange(函数(值){object.morphTargetInfluences[1]=value;});
folder.open();
//加载对象
loader=new THREE.JSONLoader();
load('leeperrysmith/morpman1.json',函数(几何体){
对象=新的三个网格(几何体);
创建场景(几何体,120)
} );
//
renderer=new THREE.WebGLRenderer({antialas:true});
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth、window.innerHeight);
container.appendChild(renderer.doElement);
renderer.shadowMap.enabled=true;
renderer.shadowMap.renderReverseSided=false;
renderer.autoClear=false;
//
renderer.gammaInput=true;
renderer.gammaOutput=true;
//
如果(StatEnabled){
统计数据=新统计数据();
container.appendChild(stats.dom);
}
//作曲家
renderer.autoClear=false;
//贝克曼
var effectBeckmann=new THREE.ShaderPass(THREE.ShaderSkin[“beckmann”]);
var effectCopy=new THREE.ShaderPass(THREE.CopyShader);
effectCopy.renderToScreen=true;
var pars={minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter,format:THREE.RGBFormat,stencilBuffer:false};
var rtwidth=512,rtheight=512;
Composer Beckmann=new THREE.EffectComposer(渲染器,new THREE.WebGLRenderTarget(rtwidth,rtheight,PAR));
作曲家贝克曼·艾德帕斯(贝克曼);
作曲家Beckmann.addPass(有效副本);
//事件
//document.addEventListener('mousemove',onDocumentMouseMove,true);
addEventListener('resize',onWindowResize,true);
控件=新的三个.轨道控件(摄影机、渲染器.doElement);
controls.addEventListener('change',render);//使用动画循环时删除
controls.enableZoom=true;
}
函数createScene(几何体、比例){
var textureLoader=new THREE.textureLoader();
//凹凸贴图
var mapHeight=textureLoader.load(“leeperrysmith/3d_skin_texture_bump_map_by_degrahuma_stock.jpg”);
mapHeight.1=4;
mapHeight.wrapps=mapHeight.wrapT=THREE.RepeatWrapping;
mapHeight.format=THREE.RGBFormat;
var mapSpecular=textureLoader.load(“leeperrysmith/3d_skin_texture_bump_map_by_degrahuma_stock.jpg”);
mapSpecular.各向异性=4;
mapSpecular.wrapps=mapSpecular.wrapT=THREE.RepeatWrapping;
mapSpecular.format=THREE.RGBFormat;
//皮肤纹理
var mapColor=textureLoader.load(“leeperrysmith/middleage\u lightskined\u male\u diffuse2.png”);
mapColor.各向异性=4;
mapColor.wrapps=mapColor.wrapT=THREE.RepeatWrapping;
mapColor.format=THREE.RGBFormat;
var shader=THREE.ShaderSkin[“skinSimple”];
var fragmentShader=shader.fragmentShader;
var vertexShader=shader.vertexShader;
var uniforms=THREE.UniformsUtils.clone(shader.uniforms);
制服[