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 🙏

© 2026 – Pkg Stats / Ryan Hefner

xrift-grab

v0.1.0

Published

Hand-grip VR grab mechanic for react-three-fiber / WebXR worlds — VRグリップ掴み機構

Readme

xrift-grab

react-three-fiber / WebXRアプリ向けの、VRコントローラのグリップで握って持ち歩く掴み機構。

@xrift/world-components(XRift SDK)は、レイキャストで狙って浮かせて置き直す配置ツール系の<Grabbable>は提供しているが、「コントローラのグリップボタンで物理的に握る→握った瞬間の向きのまま手にくっつく→両手で別々の物を同時に持てる→離すとその場に浮いて留まる」という、道具を持ち歩くタイプの掴み方は提供していない。本パッケージはそれを埋める。

XRiftに限らず、reactthree@react-three/fiberだけに依存する汎用WebXRライブラリ。

Install

npm install xrift-grab

peerDependencies: react >=19, three >=0.176.0, @react-three/fiber >=9

Usage

import { XRGrabProvider, useGrabbable } from 'xrift-grab'
import { Vector3, Quaternion } from 'three'
import { useFrame } from '@react-three/fiber'
import { useRef } from 'react'

function Pencil() {
  const meshRef = useRef<Group>(null)
  const grab = useGrabbable({
    id: 'pencil-1',
    worldPose: (outPos, outQuat) => {
      // 今の置き位置・向き(ラック上など)
      outPos.set(0, 1, 0)
      outQuat.identity()
    },
    onGrabStart: (hand, viaGrip) => console.log(`${hand}が掴んだ (grip: ${viaGrip})`),
    onDrop: (pose) => console.log('離した', pose),
  })

  useFrame(() => {
    const p = new Vector3()
    const q = new Quaternion()
    if (grab.getAttachedPose(p, q)) {
      meshRef.current?.position.copy(p)
      meshRef.current?.quaternion.copy(q)
    }
  })

  return <mesh ref={meshRef}>...</mesh>
}

function World() {
  return (
    <XRGrabProvider grabRadius={0.45}>
      <Pencil />
    </XRGrabProvider>
  )
}

クリック/レイキャストなど、グリップ以外の手段で取らせたい場合は grab.grabViaClick() を呼ぶ(defaultOffset を指定していれば、握った瞬間の相対姿勢の代わりにその既定オフセットが使われる)。

既知の制約

  • グリップ操作(squeezestart/squeezeend)はハンドトラッキングのみのセッションでは発火しないことが多い。ハンドトラッキング環境で掴ませたい場合は、selectstart(ピンチ)を検出して grabViaClick() を呼ぶ形で回避する
  • マルチプレイの「誰が持っているか」の同期・所有権はスコープ外。isFreeオプションとonGrabStart/onDropコールバックを使い、アプリ側の同期機構(例: XRiftのuseInstanceState)と組み合わせること

License

MIT