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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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
Three.js 如何将用threejs创建的东西嵌入到网站中?_Three.js_Shader - Fatal编程技术网

Three.js 如何将用threejs创建的东西嵌入到网站中?

Three.js 如何将用threejs创建的东西嵌入到网站中?,three.js,shader,Three.js,Shader,我使用three.js和着色器为图像创建了一个简单的效果。这是一个 现在我有一个问题,我将如何在网站上使用它,例如,在这种布局中,蓝色块是应该具有这种效果的图像 我在谷歌上搜索了一下,真的找不到这方面的任何东西 因为整个场景是一幅画布,我需要多幅图像,我想画布应该保持现在的状态,但是如何将图像定位在正确的位置 上面链接中的代码: <script id="vertex" type="x-shader/x-vertex"> varying f

我使用three.js和着色器为图像创建了一个简单的效果。这是一个

现在我有一个问题,我将如何在网站上使用它,例如,在这种布局中,蓝色块是应该具有这种效果的图像

我在谷歌上搜索了一下,真的找不到这方面的任何东西

因为整个场景是一幅画布,我需要多幅图像,我想画布应该保持现在的状态,但是如何将图像定位在正确的位置

上面链接中的代码:

<script id="vertex" type="x-shader/x-vertex">
  varying float wave;
  varying vec2 vUv;
  uniform float mouseIntersects;
  
  void main() {
    vUv = uv;
    vec3 pos = position;
    pos.z += -mouseIntersects / 20.0;
    
    wave = pos.z;
    
    gl_Position = projectionMatrix  * modelViewMatrix * vec4(position, 1.0 );
}
</script>
<script id="fragment" type="x-shader/x-vertex">
    uniform vec2 u_resolution;
    uniform float u_time;
    varying vec2 vUv;
    varying float wave;
    uniform sampler2D uTexture;

    void main() {
        vec2 st = gl_FragCoord.xy/u_resolution.xy;
      
        float r = texture2D(uTexture, vUv + wave).r;
        float g = texture2D(uTexture, vUv).g;
        float b = texture2D(uTexture, vUv).b;
      
        vec4 image = vec4(r, g, b, 1.0);
      
        gl_FragColor = image;
    }
  </script>
<div id="container"></div>
</body>
看看这个例子:
import { OrbitControls } from "https://threejsfundamentals.org/threejs/resources/threejs/r110/examples/jsm/controls/OrbitControls.js";

let container, camera, scene, renderer, controls, material, uniforms, geometry, mesh, raycaster;

const setup = () => {
  scene = new THREE.Scene();

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

  container = document.getElementById('container');
  container.appendChild(renderer.domElement);

  camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 0.001, 100);
  camera.position.set(0, 0, 0.5);

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

  uniforms = {
    u_time: { type: 'f', value: 0 },
    u_mouse: { type: 'v2', value: new THREE.Vector2() },
    u_resolution: { type: 'v2', value: new THREE.Vector2(window.innerWidth, window.innerHeight) },
    uTexture: { type: 't', value: new THREE.TextureLoader().load('https://images.unsplash.com/photo-1512505965932-0dbfa7e7b8c8?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=701&q=80') },
    mouseIntersects: { type: 'f', value: 0 },
  };

  material = new THREE.ShaderMaterial({
    side: THREE.DoubleSide,
    uniforms: uniforms,
    // wireframe: true,
    vertexShader: document.querySelector("#vertex").textContent,
    fragmentShader: document.querySelector("#fragment").textContent
  });

  geometry = new THREE.PlaneBufferGeometry(0.4, 0.6, 16, 16);

  mesh = new THREE.Mesh(geometry, material);

  raycaster = new THREE.Raycaster();

  scene.add(mesh);

  onWindowResize();
  window.addEventListener('resize', onWindowResize, false);
  document.addEventListener('mousemove', (e) => updateMousePositions(e), false);
};

const updateMousePositions = (e) => {
  uniforms.u_mouse.value.x = (event.clientX / window.innerWidth) * 2 - 1;
  uniforms.u_mouse.value.y = -(event.clientY / window.innerHeight) * 2 + 1;
};

const onWindowResize = (event) => {
  renderer.setSize(window.innerWidth, window.innerHeight);
  uniforms.u_resolution.value.x = renderer.domElement.width;
  uniforms.u_resolution.value.y = renderer.domElement.height;
};

const animate = () => {
  requestAnimationFrame(animate);
  render();
};
let targetValue = 0;
const render = () => {
  uniforms.u_time.value += 0.05;

  raycaster.setFromCamera(uniforms.u_mouse.value, camera);
  const intersects = raycaster.intersectObject(mesh);

  if (intersects.length === 1) {
    targetValue = 1;
  } else {
    targetValue = 0;
  }

  uniforms.mouseIntersects.value = THREE.MathUtils.lerp(
    uniforms.mouseIntersects.value,
    targetValue,
    0.1,
  );

  renderer.render(scene, camera);
};

setup();
animate();