Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript THREE.js-将属性传递给BufferGeometry而不是ShaderMaterial?_Javascript_Three.js - Fatal编程技术网

Javascript THREE.js-将属性传递给BufferGeometry而不是ShaderMaterial?

Javascript THREE.js-将属性传递给BufferGeometry而不是ShaderMaterial?,javascript,three.js,Javascript,Three.js,我正在尝试在当前版本的THREE.js上运行版本58的THREE.js示例-下面是示例 有几个错误,我可以通过简单的注释来消除,但一个更棘手的错误是: THREE.ShaderMaterial:现在应该在THREE.BufferGeometry中定义属性。 THREE.ShaderMaterial:“属性”不是此材质的属性 违规代码如下: var shaderMaterial = new THREE.ShaderMaterial( { uniforms: uniforms,

我正在尝试在当前版本的THREE.js上运行版本58的THREE.js示例-下面是示例

有几个错误,我可以通过简单的注释来消除,但一个更棘手的错误是:

THREE.ShaderMaterial:现在应该在THREE.BufferGeometry中定义属性。 THREE.ShaderMaterial:“属性”不是此材质的属性

违规代码如下:

var shaderMaterial = new THREE.ShaderMaterial( {
    uniforms:       uniforms,
    attributes:     attributes,
    vertexShader:   document.getElementById( 'vertexshader_lines' ).textContent,
    fragmentShader: document.getElementById( 'fragmentshader_lines' ).textContent,
});
其中,
属性
在上面几行定义为:

var attributes = {
    draw:        { type: 'f', value: [] },
    seed:        { type: 'f', value: [] },
    seed2:       { type: 'f', value: [] },
    customColor: { type: 'c', value: [] },
    index2:      { type: 'f', value: [] },
    norm:        { type: 'v3', value: [] },
};
我试图通过注释掉传递给
THREE.ShaderMaterial
构造函数的
attributes
参数来修复此问题,并将
THREE.Geometry
从原始版本(名为
lineGeo
)转换为进入一个
THREE.BufferedGeometry
,然后使用其
addAttribute
方法传入属性,如下所示:

var bufferLineGeo = new THREE.BufferGeometry();
bufferLineGeo.fromGeometry(lineGeo);

var values_bColor = new Float32Array(values_color.length * 3);
var values_bNorm  = new Float32Array(values_norm.length  * 3);
bufferLineGeo.addAttribute('draw',        new THREE.BufferAttribute(new Float32Array(values_draw),  1));
bufferLineGeo.addAttribute('seed',        new THREE.BufferAttribute(new Float32Array(values_seed),  1));
bufferLineGeo.addAttribute('seed2',       new THREE.BufferAttribute(new Float32Array(values_seed2), 1));
bufferLineGeo.addAttribute('customColor', new THREE.BufferAttribute(values_bColor, 3).copyColorsArray(  values_color));
bufferLineGeo.addAttribute('index2',      new THREE.BufferAttribute(new Float32Array(values_index2), 1));
bufferLineGeo.addAttribute('norm',        new THREE.BufferAttribute(values_bNorm,  3).copyVector3sArray(values_norm));
这不起作用,我现在在一个死胡同,为下一步尝试。它没有呈现任何东西-我留下了一个黑屏,控制台中没有任何东西告诉我出了什么问题

不使用当前版本的THREE.js的最小完整示例

<!doctype html>
<html lang="en">
    <head>
        <title>Long hair</title>
        <style type="text/css">
            body {
                background:#000000;
            }
        </style>
    </head>
    <body>
        <!--<script src="../build_r58/three.min.js"></script>-->
        <script src="../js/three.min.js"></script>
        <script type="x-shader/x-vertex" id="vertexshader_lines">
            uniform float globalTime;
            uniform vec3 gravity;
            uniform vec3 gravity2;
            uniform float spacing;

            attribute vec3 customColor;
            attribute float seed;
            attribute float seed2;
            attribute float draw;
            attribute float index2;
            attribute vec3 norm;

            varying vec3 vColor;
            varying float vDraw;
            varying vec3 vNormal;

            void main() {
                vDraw = draw;
                vColor = customColor;

                vec3 displacement = vec3(0.0,0.0,0.0);
                vec3 forceDirection = vec3(0.0,0.0,0.0);

                float displacementFactor = pow(index2, 1.2);
                float displacementFactor2 = pow(index2, 2.5);
                float displacementFactor3 = pow(1.0-index2, 1.0);

                // "gravity"
                vec3 g = gravity;
                g.x *= displacementFactor2*seed2;

                // "wind"
                forceDirection.x = sin(globalTime*0.1+seed2*5.0+index2*1.0) * 0.1*displacementFactor;
                forceDirection.y = cos(globalTime*0.7+seed2*5.0+index2*1.0) * 0.1*displacementFactor3;
                forceDirection.z = sin(globalTime*0.7+seed2*5.0+index2*4.0) * 0.1*displacementFactor2;

                displacement = g + forceDirection + ((1.0-index2)*gravity2)*seed;

                vec3 aNormal = norm;
                aNormal.xyz += displacement*displacementFactor;

                vNormal = norm*(1.0-index2);
                vNormal += (gravity2-gravity)*0.05;

                vec3 animated = position;

                // curl it slightly
                animated.x += aNormal.x*index2*30.0*displacementFactor3;

                animated += aNormal*index2*(spacing*seed);

                if (animated.y < -150.0+seed2*20.0) {
                    animated.y = -150.0+seed2*20.0;
                    vDraw = 0.0;
                }

                vec4 mvPosition = modelViewMatrix * vec4( animated, 1.0 );
                gl_Position = projectionMatrix * mvPosition;
            }
        </script>
        <script type="x-shader/x-fragment" id="fragmentshader_lines">
            uniform vec3 color;

            varying vec3 vColor;
            varying float vDraw;
            varying vec3 vNormal;

            void main() {
                if (vDraw == 0.0) {
                    discard;
                }

                float depth = gl_FragCoord.z / gl_FragCoord.w;
                float fogFactor = smoothstep( 450.0, 300.0, depth );        

                // light
                vec3 light = vec3(0.5,1.0,0.8);
                float d = pow(max(0.25,dot(vNormal.xyz, light))*2.0, 1.5);

                gl_FragColor = vec4( (color * vColor) * d * fogFactor, 1.0 );
            }
        </script>
        <script>
            var camera, scene, renderer;
            var delta;
            var time;
            var oldTime;
            var uniforms;
            var hair;
            var gravity = new THREE.Vector3(0,-5,0);
            var gravity2 = new THREE.Vector3(0,-5,0);
            init();
            render();

            function init() {
                scene = new THREE.Scene();

                camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 1000 );
                camera.position.z = 400;
                camera.lookAt(scene.position);
                scene.add( camera );

                var attributes = {
                    draw:        { type: 'f', value: [] },
                    seed:        { type: 'f', value: [] },
                    seed2:       { type: 'f', value: [] },
                    customColor: { type: 'c', value: [] },
                    index2:      { type: 'f', value: [] },
                    norm:        { type: 'v3', value: [] },
                };

                uniforms = {
                    color:      { type: "c", value: new THREE.Color( 0xe4b67b ) },
                    globalTime: { type: "f", value: 0.0 },
                    gravity:    { type: "v3", value: gravity },
                    gravity2:   { type: "v3", value: gravity2 },
                    spacing:    { type: "f", value: 25.0 },
                };

                var shaderMaterial = new THREE.ShaderMaterial( {
                    uniforms:       uniforms,
                    //attributes:     attributes,
                    vertexShader:   document.getElementById( 'vertexshader_lines' ).textContent,
                    fragmentShader: document.getElementById( 'fragmentshader_lines' ).textContent,
                });

                shaderMaterial.linewidth = 1;

                var lineGeo = new THREE.Geometry();
                var radius = 15;

                var num = 70;

                var baseGeo = new THREE.SphereGeometry(radius, num, num, undefined, undefined, 0.2, Math.PI*0.8);

                for (var i = 0; i < baseGeo.vertices.length; i++) {
                    baseGeo.vertices[i].x += Math.random()*4-2;
                    baseGeo.vertices[i].y += Math.random()*4-2;
                    baseGeo.vertices[i].z += Math.random()*4-2;
                }

                var seedArray = [];
                var seedArray2 = [];
                var colorArray = [];
                var drawArray = [];
                var index2Array = [];
                var normArray = [];

                for (var i = 0; i < baseGeo.vertices.length; i++) {
                    var num = 30;

                    var base = baseGeo.vertices[i];
                    var seed = 1+Math.random()*0.5;
                    var seed2 = 0.25 + Math.random()*0.75;

                    var norm = new THREE.Vector3().copy(base).normalize();
                    norm = norm.normalize();

                    var black = 0.65+Math.random()*0.75;

                    for (var j = 0; j < num; j++) {
                        var vertex = new THREE.Vector3().copy(base);
                        var color = new THREE.Color(0xffffff);
                        color.setRGB(1.0*black,1.0*black,1.0*black);

                        lineGeo.vertices.push( vertex );
                        colorArray.push( color );
                        seedArray.push( seed );
                        seedArray2.push( seed2 );
                        index2Array.push( j/num );
                        normArray.push( norm );

                        if (j == num-1 || j == 0) {
                            drawArray.push( 0 );
                        } else {
                            drawArray.push( 1 );
                        }   
                    }
                }

                var vertices = lineGeo.vertices;
                var values_color = attributes.customColor.value;
                var values_seed = attributes.seed.value;
                var values_seed2 = attributes.seed2.value;
                var values_draw = attributes.draw.value;
                var values_index2 = attributes.index2.value;
                var values_norm = attributes.norm.value;

                for( var v = 0; v < vertices.length; v++ ) {
                    values_seed[ v ] = seedArray[v];
                    values_seed2[ v ] = seedArray2[v];
                    values_draw[ v ] = drawArray[v];
                    values_color[ v ] = colorArray[v];
                    values_index2[ v ] = index2Array[v];
                    values_norm[ v ] = normArray[v];

                }

                var bufferLineGeo = new THREE.BufferGeometry();
                bufferLineGeo.fromGeometry(lineGeo);

                var values_bColor = new Float32Array(values_color.length * 3);
                var values_bNorm  = new Float32Array(values_norm.length  * 3);
                bufferLineGeo.addAttribute('draw',        new THREE.BufferAttribute(new Float32Array(values_draw),  1));
                bufferLineGeo.addAttribute('seed',        new THREE.BufferAttribute(new Float32Array(values_seed),  1));
                bufferLineGeo.addAttribute('seed2',       new THREE.BufferAttribute(new Float32Array(values_seed2), 1));
                bufferLineGeo.addAttribute('customColor', new THREE.BufferAttribute(values_bColor, 3).copyColorsArray(  values_color));
                bufferLineGeo.addAttribute('index2',      new THREE.BufferAttribute(new Float32Array(values_index2), 1));
                bufferLineGeo.addAttribute('norm',        new THREE.BufferAttribute(values_bNorm,  3).copyVector3sArray(values_norm));

                hair = new THREE.Line(bufferLineGeo,
                    //lineGeo,
                    shaderMaterial, THREE.LineStrip );
                scene.add(hair);

                renderer = new THREE.WebGLRenderer({antialias: true});
                renderer.setSize(window.innerWidth, window.innerHeight);
                document.body.appendChild(renderer.domElement);
            }

            function render() {
                requestAnimationFrame(render);
                time = new Date().getTime();
                delta = time - oldTime;
                oldTime = time;

                if (isNaN(delta) || delta > 1000 || delta == 0 ) {
                    delta = 1000/60;
                }

                uniforms.globalTime.value += delta * 0.005;
                renderer.render( scene, camera );
            }
        </script>
    </body>
</html>
<!doctype html>
<html lang="en">
    <head>
        <title>Long hair</title>
        <style type="text/css">
            body {
                background:#000000;
            }
        </style>
    </head>
    <body>
        <script src="../build_r58/three.min.js"></script>
        <!--<script src="../js/three.min.js"></script>-->
        <script type="x-shader/x-vertex" id="vertexshader_lines">
            uniform float globalTime;
            uniform vec3 gravity;
            uniform vec3 gravity2;
            uniform float spacing;

            attribute vec3 customColor;
            attribute float seed;
            attribute float seed2;
            attribute float draw;
            attribute float index2;
            attribute vec3 norm;

            varying vec3 vColor;
            varying float vDraw;
            varying vec3 vNormal;

            void main() {
                vDraw = draw;
                vColor = customColor;

                vec3 displacement = vec3(0.0,0.0,0.0);
                vec3 forceDirection = vec3(0.0,0.0,0.0);

                float displacementFactor = pow(index2, 1.2);
                float displacementFactor2 = pow(index2, 2.5);
                float displacementFactor3 = pow(1.0-index2, 1.0);

                // "gravity"
                vec3 g = gravity;
                g.x *= displacementFactor2*seed2;

                // "wind"
                forceDirection.x = sin(globalTime*0.1+seed2*5.0+index2*1.0) * 0.1*displacementFactor;
                forceDirection.y = cos(globalTime*0.7+seed2*5.0+index2*1.0) * 0.1*displacementFactor3;
                forceDirection.z = sin(globalTime*0.7+seed2*5.0+index2*4.0) * 0.1*displacementFactor2;

                displacement = g + forceDirection + ((1.0-index2)*gravity2)*seed;

                vec3 aNormal = norm;
                aNormal.xyz += displacement*displacementFactor;

                vNormal = norm*(1.0-index2);
                vNormal += (gravity2-gravity)*0.05;

                vec3 animated = position;

                // curl it slightly
                animated.x += aNormal.x*index2*30.0*displacementFactor3;

                animated += aNormal*index2*(spacing*seed);

                if (animated.y < -150.0+seed2*20.0) {
                    animated.y = -150.0+seed2*20.0;
                    vDraw = 0.0;
                }

                vec4 mvPosition = modelViewMatrix * vec4( animated, 1.0 );
                gl_Position = projectionMatrix * mvPosition;
            }
        </script>
        <script type="x-shader/x-fragment" id="fragmentshader_lines">
            uniform vec3 color;

            varying vec3 vColor;
            varying float vDraw;
            varying vec3 vNormal;

            void main() {
                if (vDraw == 0.0) {
                    discard;
                }

                float depth = gl_FragCoord.z / gl_FragCoord.w;
                float fogFactor = smoothstep( 450.0, 300.0, depth );        

                // light
                vec3 light = vec3(0.5,1.0,0.8);
                float d = pow(max(0.25,dot(vNormal.xyz, light))*2.0, 1.5);

                gl_FragColor = vec4( (color * vColor) * d * fogFactor, 1.0 );
            }
        </script>
        <script>
            var camera, scene, renderer;
            var delta;
            var time;
            var oldTime;
            var uniforms;
            var hair;
            var gravity = new THREE.Vector3(0,-5,0);
            var gravity2 = new THREE.Vector3(0,-5,0);
            init();
            render();

            function init() {
                scene = new THREE.Scene();

                camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 1000 );
                camera.position.z = 400;
                camera.lookAt(scene.position);
                scene.add( camera );

                var attributes = {
                    draw:        { type: 'f', value: [] },
                    seed:        { type: 'f', value: [] },
                    seed2:       { type: 'f', value: [] },
                    customColor: { type: 'c', value: [] },
                    index2:      { type: 'f', value: [] },
                    norm:        { type: 'v3', value: [] },
                };

                uniforms = {
                    color:      { type: "c", value: new THREE.Color( 0xe4b67b ) },
                    globalTime: { type: "f", value: 0.0 },
                    gravity:    { type: "v3", value: gravity },
                    gravity2:   { type: "v3", value: gravity2 },
                    spacing:    { type: "f", value: 25.0 },
                };

                var shaderMaterial = new THREE.ShaderMaterial( {
                    uniforms:       uniforms,
                    attributes:     attributes,
                    vertexShader:   document.getElementById( 'vertexshader_lines' ).textContent,
                    fragmentShader: document.getElementById( 'fragmentshader_lines' ).textContent,
                });

                shaderMaterial.linewidth = 1;

                var lineGeo = new THREE.Geometry();
                var radius = 15;

                var num = 70;

                var baseGeo = new THREE.SphereGeometry(radius, num, num, undefined, undefined, 0.2, Math.PI*0.8);

                for (var i = 0; i < baseGeo.vertices.length; i++) {
                    baseGeo.vertices[i].x += Math.random()*4-2;
                    baseGeo.vertices[i].y += Math.random()*4-2;
                    baseGeo.vertices[i].z += Math.random()*4-2;
                }

                var seedArray = [];
                var seedArray2 = [];
                var colorArray = [];
                var drawArray = [];
                var index2Array = [];
                var normArray = [];

                for (var i = 0; i < baseGeo.vertices.length; i++) {
                    var num = 30;

                    var base = baseGeo.vertices[i];
                    var seed = 1+Math.random()*0.5;
                    var seed2 = 0.25 + Math.random()*0.75;

                    var norm = new THREE.Vector3().copy(base).normalize();
                    norm = norm.normalize();

                    var black = 0.65+Math.random()*0.75;

                    for (var j = 0; j < num; j++) {
                        var vertex = new THREE.Vector3().copy(base);
                        var color = new THREE.Color(0xffffff);
                        color.setRGB(1.0*black,1.0*black,1.0*black);

                        lineGeo.vertices.push( vertex );
                        colorArray.push( color );
                        seedArray.push( seed );
                        seedArray2.push( seed2 );
                        index2Array.push( j/num );
                        normArray.push( norm );

                        if (j == num-1 || j == 0) {
                            drawArray.push( 0 );
                        } else {
                            drawArray.push( 1 );
                        }   
                    }
                }

                var vertices = lineGeo.vertices;
                var values_color = attributes.customColor.value;
                var values_seed = attributes.seed.value;
                var values_seed2 = attributes.seed2.value;
                var values_draw = attributes.draw.value;
                var values_index2 = attributes.index2.value;
                var values_norm = attributes.norm.value;

                for( var v = 0; v < vertices.length; v++ ) {
                    values_seed[ v ] = seedArray[v];
                    values_seed2[ v ] = seedArray2[v];
                    values_draw[ v ] = drawArray[v];
                    values_color[ v ] = colorArray[v];
                    values_index2[ v ] = index2Array[v];
                    values_norm[ v ] = normArray[v];

                }

                /*var bufferLineGeo = new THREE.BufferGeometry();
                bufferLineGeo.fromGeometry(lineGeo);

                var values_bColor = new Float32Array(values_color.length * 3);
                var values_bNorm  = new Float32Array(values_norm.length  * 3);
                bufferLineGeo.addAttribute('draw',        new THREE.BufferAttribute(new Float32Array(values_draw),  1));
                bufferLineGeo.addAttribute('seed',        new THREE.BufferAttribute(new Float32Array(values_seed),  1));
                bufferLineGeo.addAttribute('seed2',       new THREE.BufferAttribute(new Float32Array(values_seed2), 1));
                bufferLineGeo.addAttribute('customColor', new THREE.BufferAttribute(values_bColor, 3).copyColorsArray(  values_color));
                bufferLineGeo.addAttribute('index2',      new THREE.BufferAttribute(new Float32Array(values_index2), 1));
                bufferLineGeo.addAttribute('norm',        new THREE.BufferAttribute(values_bNorm,  3).copyVector3sArray(values_norm));*/

                hair = new THREE.Line(//bufferLineGeo,
                    lineGeo,
                    shaderMaterial, THREE.LineStrip );
                scene.add(hair);

                renderer = new THREE.WebGLRenderer({antialias: true});
                renderer.setSize(window.innerWidth, window.innerHeight);
                document.body.appendChild(renderer.domElement);
            }

            function render() {
                requestAnimationFrame(render);
                time = new Date().getTime();
                delta = time - oldTime;
                oldTime = time;

                if (isNaN(delta) || delta > 1000 || delta == 0 ) {
                    delta = 1000/60;
                }

                uniforms.globalTime.value += delta * 0.005;
                renderer.render( scene, camera );
            }
        </script>
    </body>
</html>

长发
身体{
背景:#000000;
}
均匀浮球时间;
均匀vec3重力;
均匀矢量3引力2;
均匀浮动间距;
属性vec3自定义颜色;
属性浮动种子;
属性浮动种子2;
属性浮动绘制;
属性浮动指数x2;
属性向量3范数;
可变vec3颜色;
可变浮点数;
可变vec3 vNormal;
void main(){
vDraw=绘制;
vColor=自定义颜色;
vec3位移=vec3(0.0,0.0,0.0);
vec3力方向=vec3(0.0,0.0,0.0);
浮动位移系数=功率(index2,1.2);
浮子位移系数2=功率(index2,2.5);
浮动位移系数3=功率(1.0-1.0);
//“重力”
vec3 g=重力;
g、 x*=位移系数2*种子2;
//“风”
力方向x=sin(全局时间*0.1+种子2*5.0+指数x2*1.0)*0.1*位移系数;
力方向y=cos(全局时间*0.7+种子2*5.0+索引x*1.0)*0.1*位移系数3;
力方向z=sin(全局时间*0.7+种子2*5.0+指数x2*4.0)*0.1*位移系数2;
位移=g+力方向+((1.0-index2)*重力2)*种子;
vec3异常=正常;
异常.xyz+=位移*位移系数;
vNormal=norm*(1.0-index2);
V正常+=(重力2重力)*0.05;
vec3=位置;
//稍微卷曲一下
动画.x+=异常.x*index2*30.0*位移系数3;
动画+=异常*index2*(间距*种子);
如果(动画.y<-150.0+种子2*20.0){
动画.y=-150.0+种子2*20.0;
vDraw=0.0;
}
vec4 mvPosition=modelViewMatrix*vec4(动画,1.0);
gl_位置=投影矩阵*mvPosition;
}
vec3颜色均匀;
可变vec3颜色;
可变浮点数;
可变vec3 vNormal;
void main(){
如果(vDraw==0.0){
丢弃;
}
浮动深度=gl_FragCoord.z/gl_FragCoord.w;
浮动雾系数=平滑步长(450.0、300.0、深度);
//轻的
vec3光=vec3(0.5,1.0,0.8);
浮动d=功率(最大值(0.25,点(vNormal.xyz,光))*2.0,1.5);
gl_FragColor=vec4((颜色*vColor)*d*雾因子,1.0);
}
摄像机、场景、渲染器;
var三角洲;
var时间;
var oldTime;
var制服;
毛发变异;
var重力=新的三个矢量3(0,-5,0);
var gravity2=新的三个向量3(0,-5,0);
init();
render();
函数init(){
场景=新的三个。场景();
摄像头=新的三个透视摄像头(45,window.innerWidth/window.innerHeight,11000);
摄像机位置z=400;
摄像机。注视(场景。位置);
场景。添加(摄影机);
变量属性={
绘图:{type:'f',value:[]},
种子:{type:'f',value:[]},
种子2:{type:'f',value:[]},
customColor:{type:'c',value:[]},
index2:{type:'f',value:[]},
norm:{type:'v3',值:[]},
};
制服={
颜色:{type:“c”,值:new THREE.color(0xe4b67b)},
全局时间:{type:“f”,值:0.0},
重力:{类型:“v3”,值:重力},
gravity2:{type:“v3”,值:gravity2},
间距:{type:“f”,值:25.0},
};
var shaderMaterial=新的三个。shaderMaterial({
制服:制服,
//属性:属性,
vertexShader:document.getElementById('vertexShader_lines').textContent,
fragmentShader:document.getElementById('fragmentShader_lines').textContent,
});
shaderMaterial.linewidth=1;
var lineGeo
bufferLineGeo.fromGeometry( lineGeo );
var positions = new Float32Array( vertices.length * 3 );
bufferLineGeo.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ).copyVector3sArray( vertices ) );