npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@drumtj/v3d

v1.0.29

Published

simple 3d view

Downloads

78

Readme

v3d

npm version license

make a simple 3d view (CSS3D based using threejs)

Installing

Using npm:

$ npm install @drumtj/v3d

Using cdn:

<script src="https://unpkg.com/@drumtj/[email protected]/dist/v3d.js"></script>

CommonJS

import V3D from '@drumtj/v3d';
const V3D = require('@drumtj/v3d');

How To

// init full viewport size
var v3d = new V3D(".container");
// init full viewport size
var container = document.querySelector(".container");
var v3d = new V3D(container);
// init with custom viewport size
var v3d = new V3D(".container", {
  viewport: {
    width: 800,
    height: 600
  }
});
// init with camera option,  // default camera z position is 1000
var v3d = new V3D(".container", {
  camera: {
    position: {
      z: 1500
    }
  }
})
// also you can set camera rotation when init. rotation unit is degree.
var v3d = new V3D(".container", {
  camera: {    
    position: {
      z: 1500
    },
    rotation: {
      z: -15
    }
  }
})
// you can get camera object from instance of V3D
var v3d = new V3D(".container");
v3d.camera.position.z = 1500;
v3d.camera.rotation.z = V3D.math.degToRad(-10);
// set onUpdate
var v3d = new V3D(".container", {
  onUpdate: function(time){
    if(v3d) v3d.root.rotation.y = Math.cos(time/1000);
  }
});
v3d.startAnimate();
// set onUpdate
var v3d = new V3D(".container");
v3d.onUpdate = function(time){
  if(v3d) v3d.root.rotation.y = Math.cos(time/1000);
}
v3d.startAnimate();
// add element
let img = new Image();
img.src = "https://lh3.googleusercontent.com/proxy/8HGxCTGmkoShDUA0NhfJebwJ9xuHxlWV1Qg1cTNemgAoVHC5ph6Zua7F4aoCZts9aWoWE9m4N3kmq4YoykXhVSDv0Eo61qYzXf1Rv91TEkDtcA";
v3d.add(img);
v3d.render();
// add element
let target = document.getElementById("target");
v3d.add(target);
v3d.render();
// add element by css selector
v3d.add("#target");
v3d.render();
// add element by html string
v3d.add('<div class="box">');
v3d.render();
// add element with attribute
v3d.add("#target", {
  rotation: {
    x: -10
  },
  position: {
    x: 100
  },
  // css style
  style: {
    width: "100px"
  }
});
v3d.render();
// get 3d Object for control
let obj = v3d.add("#target");
obj.rotation.x = V3D.math.degToRad(-10);
v3d.render();
// set object name to find
v3d.add("#target", {name:"test"});
v3d.render();
// set object name to find
let obj = v3d.add("#target");
obj.name = "test";
var object1 = v3d.scene.getObjectByName("test");

//to recursively search the scene graph
var object2 = v3d.scene.getObjectByName("objectName", true);

var object3 = v3d.scene.getObjectById(4, true);

var object4 = v3d.getObjectByElement(html_element);
// tween
// In order to tween, startAnimate must be executed.
v3d.startAnimate();
var box1 = v3d.add('<div class="box">');
var tweens = v3d.tween(v3d.camera, box1);
//  kill tween
v3d.killTween(tweens);
// tween with option
v3d.startAnimate();
var box1 = v3d.add('<div class="box">');
v3d.tween(v3d.camera, box1, 2000, {
  lookAtDistance: 400
  //offsetPosition: THREE.Vector3|{x?:number;y?:number;z?:number};
  //withPosition?: boolean;
  //withRotation?: boolean;
  //delay?: number;
  //rotationDelay?: number;
  //onComplete?: ()=>void;
  //easing?: any;
});
$(".box").on("click", function(event){
  v3d.tween(v3d.camera, event.target, 2000, {
    lookAtDistance: 400
  })
})

//////// static method////////
// three js ref
V3D.THREE

// @tweenjs/tween.js ref
V3D.TWEEN

// math functions
V3D.math.getDeg(x1:number, y1:number, x2:number, y2:number):number
V3D.math.getRad(x1:number, y1:number, x2:number, y2:number):number
V3D.math.getCoord(angle:number, distance:number):{x:number, y:number}
V3D.math.degToRad(degree:number):number
V3D.math.radToDeg(radian:number):number
V3D.math.distance(x1:number, y1:number, x2:number, y2:number):number
V3D.math.normalRad(rad:number):number
V3D.math.randInt(low:number, high:number):number
V3D.math.randFloat(low:number, high:number):number
V3D.math.getDestinationRad(fromRad:number, toRad:number):number;


//////// member property////////

// https://threejs.org/docs/#api/en/scenes/Scene
v3d.scene

// https://threejs.org/docs/#api/en/cameras/Camera
v3d.camera

// https://threejs.org/docs/#examples/en/renderers/CSS3DRenderer
v3d.renderer

// html element.  by first parameter of constructor
v3d.container

// Top-level object. Added as a child of v3d.root when v3d.add()
v3d.root

// viewport element.  v3d.renderer.domElement;
v3d.viewport

// update callback
v3d.onUpdate:(time:number)=>void;




//////// member method////////
render() // once
startAnimate() // render loop
stopAnimate()
add(selector:string|HTMLElement, option?:AddOption):CSS3DObject
interface AddOption {
  rotation?:{x?:number;y?:number;z?:number}|THREE.Vector3|THREE.Euler;
  position?:{x?:number;y?:number;z?:number}|THREE.Vector3;
  name?:string;
  style?:any;
  parent?:THREE.Object3D|CSS3DObject;
}
checkInCamera(object:CSS3DObject|CSS3DObject[]): boolean|boolean[]
getMouseVector(event:MouseEvent, refVector?:THREE.Vector3):THREE.Vector3
cloneEmptyObject(object:THREE.Object3D|CSS3DObject):THREE.Object3D
getObjectByElement(element:HTMLElement):CSS3DObject

tween(
  object:HTMLElement|CSS3DObject|THREE.Object3D, target:HTMLElement|CSS3DObject|THREE.Object3D|{position?:{x?:number;y?:number;z?:number},rotation?:{x?:number;y?:number;z?:number},opacity?:number},
  duration:number,
  option?:TweenOption
):TWEEN.Tween[]

killTween(tweens:TWEEN.Tween[])
interface TweenOption {
  offsetPosition?: THREE.Vector3|{x?:number;y?:number;z?:number};
  lookAtDistance?: number;
  withPosition?: boolean;
  withRotation?: boolean;
  delay?: number;
  rotationDelay?: number;
  onComplete?: ()=>void;
  easing?: any;
}

addUpdateCallback(callback:(time:number)=>void):void
removeUpdateCallback(callbackRef:Function)
clearUpdateCallback()
// full example-1
var v3d = new V3D(".container");
v3d.add("#target", {
  rotation: {
    x: -10,
    y: -10
  }
});
v3d.render();
// full example-2
var v3d = new V3D(".container", {
  camera: {
    rotation: {
      x: -30
    },
    position: {
      y: 500
    }
  }
});
v3d.add("#target", {
  position: {
    z: 200
  }
});
v3d.render();
// full example-3
var container = document.querySelector(".container");
var v3d = new V3D(container);
v3d.camera.rotation.z = V3D.math.degToRad(-10);
v3d.add("#target").position.z = 450;

var div = document.createElement("div");
v3d.add(div);

v3d.onUpdate = function(time) {
  if(v3d) v3d.root.rotation.y = Math.cos(time / 1000);
}
v3d.startAnimate();
// full example-4
var v3d = new V3D(".container");
var box = v3d.add('<div class="box">');
box.element.contentEditable = true;
box.element.textContent = "hi~";

document.addEventListener("mousemove", function(event){
  event.preventDefault();
  // var x = (event.clientX / window.innerWidth) * 2 - 1;
  // var y = -(event.clientY / window.innerHeight) * 2 + 1;
  // box.lookAt(x, y, 0.5);

  box.lookAt(v3d.getMouseVector(event));
  v3d.render();
})
// full example-5
var THREE = V3D.THREE;
var v3d = new V3D(".container");
var boxHtml = '<div class="box">';
var boxCount = 10;
var distance = 1400;
var angle = 120;

var angleUnit = -angle/boxCount;
var startAngle = (180 - angle) / 2;

//camera rotate speed
var mouseDistance = 1.5;
var mouse = new THREE.Vector3(0, 0, v3d.camera.position.z - mouseDistance);

for(var i=0; i<boxCount; i++){
  var box = v3d.add(boxHtml);
  var coord = V3D.math.getCoord(i*angleUnit-startAngle, distance);
  box.position.x = v3d.camera.position.x + coord.x;
  box.position.z = v3d.camera.position.z + coord.y;
  box.lookAt(v3d.camera.position);
}

document.addEventListener("mousemove", function(event){
  event.preventDefault();
  v3d.getMouseVector(event, mouse);
  mouse.y *= 0.2;
  v3d.camera.lookAt(mouse);
  v3d.render();
})

examples

License

MIT