three+gsap实现三维鼠标牵绳子小兔子围绕旋转吃萝卜小游戏代码

代码语言:html

所属分类:三维

代码描述:three+gsap实现三维鼠标牵绳子小兔子围绕旋转吃萝卜小游戏代码,单击鼠标小兔子跳跃,拖动鼠标可用绳子牵引小兔子改变位置。

代码标签: three gsap 三维 跟随 鼠标 小兔子 围绕 绳子 旋转 吃萝卜 小游戏 代码

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en" >

<head>
  <meta charset="UTF-8">
  


  
  
<style>
@import url(https://fonts.googleapis.com/css?family=Open+Sans:600);
.webgl {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  outline: none;
  background-color: #000000;
  cursor: move;
  /* fallback if grab cursor is unsupported */
  cursor: grabbing;
  cursor: -webkit-grabbing;
}

#credits {
  position: absolute;
  width: 100%;
  margin: auto;
  bottom: 0;
  margin-bottom: 20px;
  font-family: "Open Sans", sans-serif;
  color: #544027;
  font-size: 0.7em;
  text-transform: uppercase;
  text-align: center;
}

#credits a {
  color: #7beeff;
}

#credits a:hover {
  color: #ff3434;
}

#instructions {
  position: absolute;
  width: 100%;
  margin: auto;
  bottom: 60px;
  font-family: "Open Sans", sans-serif;
  color: #ff3434;
  font-size: 0.7em;
  text-transform: uppercase;
  text-align: center;
}
</style>

  
  
</head>

<body translate="no">
  <canvas class="webgl"></canvas>

<div id="instructions"> - Press to jump - </div>


<script type="x-shader/x-vertex" id="reflectorVertexShader">
  uniform mat4 textureMatrix;
  varying vec4 vUvReflection;
  varying vec2 vUv; 

  #include <common>
  #include <shadowmap_pars_vertex>
  #include <logdepthbuf_pars_vertex>

void main() {
	#include <beginnormal_vertex>
	#include <defaultnormal_vertex>
	#include <begin_vertex>

	vUvReflection = textureMatrix * vec4( position, 1.0 );
	vUv = uv;

	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );

	#include <logdepthbuf_vertex>
	#include <worldpos_vertex>
	#include <shadowmap_vertex>
    
}
</script> 
  
<script type="x-shader/x-fragment" id="reflectorFragmentShader">
  uniform vec3 color;
	uniform sampler2D tDiffuse;
  uniform sampler2D tScratches;
  varying vec4 vUvReflection;
	varying vec2 vUv;
  
  #include <common>
  #include <packing>
  #include <lights_pars_begin>
  #include <shadowmap_pars_fragment>
  #include <shadowmask_pars_fragment>
	#include <logdepthbuf_pars_fragment>
  
  vec4 blur9(sampler2D image, vec4 uv, vec2 resolution, vec2 direction) {
        vec4 color = vec4(0.0);
        vec2 off1 = vec2(1.3846153846) * direction;
        vec2 off2 = vec2(3.2307692308) * direction;
        color += texture2DProj(image, uv) * 0.2270270270;
        color += texture2DProj(image, uv + vec4(off1 / resolution, off1 / resolution)) * 0.3162162162;
        color += texture2DProj(image, uv - vec4(off1 / resolution, off1 / resolution)) * 0.3162162162;
        color += texture2DProj(image, uv + vec4(off2 / resolution, off2 / resolution)) * 0.0702702703;
        color += texture2DProj(image, uv - vec4(off2 / resolution, off2 / resolution)) * 0.0702702703;
        return color;
  }
	
  float blendOverlay( float base, float blend ) {
			return( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );
	}

	vec3 blendOverlay( vec3 base, vec3 blend ) {
		return vec3( blendOverlay( base.r, blend.r ), blendOverlay( base.g, blend.g ), blendOverlay( base.b, blend.b ) );
	}

	void main() {
			#include <logdepthbuf_fragment>
        
        
			vec4 displacement = vec4( sin(vUvReflection.y * 3.) * .05, sin(vUvReflection.x * 3.) * .05, 0.0, 0.0);
      vec2 resolution = vec2(30., 30.);
      vec4 base = blur9( tDiffuse, vUvReflection + displacement, resolution, vec2(1., 0.) ) * .25;
      base += blur9( tDiffuse, vUvReflection + displacement, resolution, vec2(-1., 0.) ) * .25;
      base += blur9( tDiffuse, vUvReflection + displacement, resolution, vec2(0, 1.) ) * .25;
      base += blur9( tDiffuse, vUvReflection + displacement, resolution, vec2(0, -1.) ) * .25;
    
      vec4 scratchesCol = texture2D( tScratches, vUv);
    
			vec3 col = mix(color, base.rgb, .5);
      col.rgb += scratchesCol.r * .02;
	    col.gb -= scratchesCol.g * .01;
      col.gb -= (1.0 - getShadowMask() ) * .015;
    
      gl_FragColor = vec4(col, 1.0);
			#include <tonemapping_fragment>
			#include <colorspace_fragment>
		}
</script>  
<script type="x-shader/x-vertex" id="simulationVertexShader">
  precision highp float;

  uniform float time;
  varying vec2 vUv;

  void main() {
    vUv = uv;
    vec4 modelViewPosition = modelViewMatrix * vec4(position, 1.0);
    gl_Position = projectionMatrix * modelViewPosition; 
  }
</script>

<script type="x-shader/x-fragment" id="simulationFragmentShader">
  // fragment shader
  precision highp float;

  uniform sampler2D inputTexture;
  uniform vec2 blade1PosOld;
  uniform vec2 blade1PosNew;
  uniform float strength;
  uniform float time;
  varying vec2 vUv;

  float lineSegment(vec2 p, vec2 a, vec2 b, float thickness) {
      vec2 pa = p - a;
      vec2 ba = b - a;
      float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );
      float idk = length(pa - ba*h);
      return smoothstep(thickness, .2 * thickness, idk);
  }

  void main(void) {
    vec4 prevTexture = texture2D(inputTexture, vUv);
    vec3 col = prevTexture.rgb * .999;
    if (strength>0.){
        float space = .001;
        float crease = .001;
        float thickness = .001 + strength * .001;
        float leftRed = lineSegment(vUv + space, blade1PosOld, blade1PosNew, thickness);
        float leftGreen = lineSegment(vUv + space + crease, blade1PosOld, blade1PosNew, thickness);
        float rightRed = lineSegment(vUv - space - crease, blade1PosOld, blade1PosNew, thickness);
        float rightGreen = lineSegment(vUv - space, blade1PosOld, blade1PosNew, thickness);
        col.r += ( leftRed + rightRed ) * strength * 3.0;
        col.g += ( leftGreen + rightGreen) * strength * 3.0;
        col.r = clamp(col.r, .0, 1.0);
        col.g = clamp(col.g, .0, 1.0);
    }
    gl_FragColor = vec4(col, 1.0);
}
</script>

<script type="x-shader/x-fragment" id="outlineFragmentShader">
  uniform vec3 color;
  void main(void) {
      gl_FragColor = vec4( color, 1.0);
  }
</script>

<script type="x-shader/x-vertex" id="outlineVertexShader">
  uniform float size;
  uniform float time;

  void main() {
    vec3 transformed = position + normal * size * (1.0 + abs( sin ( position.y * time * .02 ) * 2.0 ));
    vec4 modelViewPosition = modelViewMatrix * vec4(transformed, 1.0);
    gl_Position = projectionMatrix * modelViewPosition; 
  }
</script>
  <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/gsap.3.12.2.js"></script>
      <script type="module">
import * as THREE from "//repo.bfw.wiki/bfwrepo/js/module/three/build/156/three.module.js";
import { OrbitControls } from "//repo.bfw.wiki/bfwrepo/js/module/three/examples/156/jsm/controls/OrbitControls.js";
import { GLTFLoader } from "//repo.bfw.wiki/bfwrepo/js/module/three/examples/156/jsm/loaders/GLTFLoader.js";

import { Reflector } from "//repo.bfw.wiki/bfwrepo/js/module/three/examples/156/jsm/objects/Reflector.js";

document.addEventListener("DOMContentLoaded", () => new App());

class App {
  constructor() {
    this.winWidth = window.innerWidth;
    this.winHeight = window.innerHeight;
    this.gltfFile = "//repo.bfw.wiki/bfwrepo/threemodel/rabbit.glb";
    this.loadAssets();
  }

  loadAssets() {
    const loaderModel = new GLTFLoader();
    loaderModel.load(this.gltfFile, gltf => {
      this.model = gltf.scene;
      this.setUpScene();
    });
  }

  setUpScene() {
    // Scene
    this.scene = new THREE.Scene();
    this.bgrColor = 0x332e2e;
    this.fog = new THREE.Fog(this.bgrColor, 13, 20);
    this.scene.fog = this.fog;
    this.camera = new THREE.PerspectiveCamera(
    60,
    this.winWidth / this.winHeight,
    1,
    100);

    this.camera.position.set(0, 4, 8);
    this.camera.lookAt(new THREE.Vector3());
    this.scene.add(this.camera);

    // Hero params
    this.heroAngularSpeed = 0;
    this.heroOldRot = 0;
    this.heroDistance = 0;
    this.heroOldUVPos = new THREE.Vector2(0.5, 0.5);
    this.heroNewUVPos = new THREE.Vector2(0.5, 0.5);
    this.heroSpeed = new THREE.Vector2(0, 0);
    this.heroAcc = new THREE.Vector2(0, 0);
    this.targetHeroUVPos = new THREE.Vector2(0.5, 0.5);
    this.targetHeroAbsMousePos = new THREE.Vector2(0, 0);
    this.raycaster = new THREE.Raycaster();
    this.mouse = new THREE.Vector2();
    this.isJumping = this.isLanding = false;
    this.jumpParams = { jumpProgress: 0, landProgress: 0 };

    // Clock
    this.clock = new THREE.Clock();
    this.time = 0;
    this.deltaTime = 0;

    // Core
    this.createRenderer();
    this.createSim();
    //this.createControls();
    this.createListeners();

    // Environment
    this.floorSize = 30;
    this.createMaterials();
    this.processModel();
    this.createFloor();
    this.createLine();
    this.createLight();
    this.createParticles();

    // Render loop
    this.draw();
  }

  processModel() {
    this.rabbit = this.model.getObjectByName("Rabbit");
    this.rabbitBody = this.model.getObjectByName("body");
    this.earRight = this.model.getObjectByName("earRight");
    this.earLeft = this.model.getObjectByName("earLeft");
    this.tail = this.model.getObjectByName("tail");
    this.footLeft = this.model.getObjectByName("footLeft");
    this.footRight = this.model.getObjectByName("footRight");
    this.eyeLeft = this.model.getObjectByName("eyeLeft");
    this.eyeRight = this.model.getObjectByName("eyeRight");
    this.carrot = this.model.getObjectByName("carrot");
    this.carrotLeaf = this.model.getObjectByName("carrotLeaf");
    this.carrotLeaf2 = this.model.getObjectByName("carrotLeaf2");
    this.carrot.rotation.z = 0.2;
    this.carrot.rotation.x = 0.2;
    this.rabbitBody.material = this.primMat;
    this.earRight.material = this.primMat;
    this.earLeft.material = this.primMat;
    this.tail.material = this.primMat;
    this.footLeft.material = this.secMat;
    this.footRight.material = this.secMat;
    this.eyeLeft.material = this.secMat;
    this.eyeRight.material = this.secMat;
    this.carrot.material = this.bonusMat;
    this.carrotLeaf.material = this.primMat;
    this.carrotLeaf2.material = this.primMat;

    this.addOutline(this.rabbitBody);
    this.addOutline(this.earRight);
    this.addOutline(this.earLeft);
    this.addOutline(this.tail);
    this.addOutline(this.carrot);

    this.rabbit.traverse(object => {
      if (object.isMesh) {
        object.castShadow = true;
        object.receiveShadow = true;
      }
    });

    this.carrot.traverse(object => {
      if (object.isMesh) {
        object.castShadow = true;
      }
    });

    this.scene.add(this.rabbit);
    this.scene.add(this.carrot);
  }

  createFloor() {

    this.floor = new Reflector(
    new THREE.PlaneGeometry(this.floorSize, this.floorSize),
    {
      color: new THREE.Color(this.bgrColor),
      textureWidth: 1024,
      textureHeight: 1024 });


    this.floor.rotation.x = -Math.PI / 2;
    this.floor.receiveShadow = true;
    this.modifyFloorShader();

    this.scene.add(this.floor);
  }

  createLine() {
    const material = new THREE.LineDashedMaterial({
      color: 0x7beeff,
      linewidth: 1,
      scale: 1,
      dashSize: 0.2,
      gapSize: 0.1 });


    const points = [];
    points.push(new THREE.Vector3(0, 0.2, 0));
    points.push(new THREE.Vector3(3, 0.2, 3));
    const geometry = new THREE.BufferGeometry().setFromPoints(points);
    this.line = new THREE.Line(geometry, material);
    this.scene.add(this.line);
  }

  createParticles() {
    let bodyCount = 20;
    let tailCount = 5;
    let particleGeom = new THREE.BoxGeometry(.2, .2, .2, 1, 1, 1);
    this.particles1 = [];
    this.particles2 = [];

    let i = 0;

    for (i = 0; i < bodyCount; i++) {
      let m = new THREE.Mesh(particleGeom, this.bonusMat);
      this.particles1.push(m);
      m.scale.set(0, 0, 0);
      this.scene.add(m);
    }

    for (i = 0; i < tailCount; i++) {
      let m = new THREE.Mesh(particleGeom, this.primMat);
      this.particles2.push(m);
      m.scale.set(0, 0, 0);
      this.scene.add(m);
    }
  }

  createLight() {
    this.ambientLight = new THREE.AmbientLight(0xffffff);
    this.scene.add(this.ambientLight);

    this.light = new THREE.DirectionalLight(0xffffff, 1);
    this.light.position.set(1, 5, 1);
    this.light.castShadow = true;
    this.light.shadow.mapSize.width = 512;
    this.light.shadow.mapSize.height = 512;
    this.light.shadow.camera.near = 0.5;
    this.light.shadow.camera.far = 12;
    this.light.shadow.camera.left = -12;
    this.light.shadow.camera.right = 12;
    this.light.shadow.camera.bottom = -12;
    this.light.shadow.camera.top = 12;
    this.light.shadow.radius = 3;
    this.light.shadow.blurSamples = 4;
    this.scene.add(this.light);

    const helper = new THREE.CameraHelper(this.light.shadow.camera);
    //this.scene.add(helper);
  }

  createRenderer() {
    const canvas = document.querySelector("canvas.webgl");
    this.renderer = new THREE.WebGLRenderer({
      canvas,
      antialias: true,
      preserveDrawingBuffer: true });

    this.renderer.setClearCo.........完整代码请登录后点击上方下载按钮下载查看

网友评论0