# BVHEcctrl
**Repository Path**: mirrors_pmndrs/BVHEcctrl
## Basic Information
- **Project Name**: BVHEcctrl
- **Description**: A simple R3f character controller
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-06-25
- **Last Updated**: 2026-02-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 🕹️ BVHEcctrl
[](https://bvhecctrl.vercel.app/)
[**BVHEcctrl**](https://github.com/pmndrs/bvhecctrl) is a lightweight, plug-and-play character controller designed for [`react-three-fiber`](https://github.com/pmndrs/react-three-fiber). It requires **no physics engine**, and utilizes [`three-mesh-bvh`](https://github.com/gkjohnson/three-mesh-bvh) for highly efficient, triangle-accurate collision detection and response.
> 🧠 Ideal for web-based 3D experiences such as games, interactive portfolios, and virtual worlds.
---
## 📸 Examples
---
## ✨ Features
- No physics engine required
- Fast BVH-based collision detection
- Smooth floating capsule movement for stairs, slopes, and uneven surfaces
- Built-in support for:
- `StaticCollider`
- `KinematicCollider`
- `InstancedStaticCollider`
---
## 📦 Installation
```bash
npm install bvhecctrl
```
## ⚙️ How to Use
### Step 1: Setup Keyboard Controls and Character Controller
```js
import BVHEcctrl from "bvhecctrl";
import { KeyboardControls } from "@react-three/drei";
const keyboardMap = [
{ name: "forward", keys: ["ArrowUp", "KeyW"] },
{ name: "backward", keys: ["ArrowDown", "KeyS"] },
{ name: "leftward", keys: ["ArrowLeft", "KeyA"] },
{ name: "rightward", keys: ["ArrowRight", "KeyD"] },
{ name: "jump", keys: ["Space"] },
{ name: "run", keys: ["Shift"] },
];
return (
);
```
### Step 2: Add Colliders to Your Map
```js
import {
StaticCollider,
KinematicCollider,
InstancedStaticCollider,
} from "bvhecctrl";
useFrame((_, delta) => {
if (kinematicRef.current) kinematicRef.current.rotation.y += delta;
});
return (
<>
>
);
```
### Step 3: Handle Camera Movement
You can use any camera control system that fits your needs — such as ``, ``, ``, or your own custom setup.
For smooth and flexible control, I highly recommend using [``](https://github.com/yomotsu/camera-controls) from [`@react-three/drei`](https://github.com/pmndrs/drei). It even offers built-in camera collision support.
Here’s a simple example using `` to follow the character:
```js
useFrame(() => {
camControlRef.current.moveTo(
ecctrlRef.current.group.position.x,
ecctrlRef.current.group.position.y + 0.3,
ecctrlRef.current.group.position.z,
true
);
});
```
## 🧱 BVHEcctrl Props
| Prop | Type | Default | Description |
| ---------------------------- | ---------------------------------------- | ------------------ | ------------------------------------------------------------- |
| `debug` | `boolean` | `false` | Enables visual debugging. |
| `colliderCapsuleArgs` | `[number, number, number, number]` | `[0.3, 0.6, 4, 8]` | Capsule shape: [radius, height, capSegments, radialSegments]. |
| `paused` | `boolean` | `false` | Freezes character physics and collision response. |
| `delay` | `number` | `1.5` | Physics delay after initialization (in seconds). |
| `gravity` | `number` | `9.81` | World gravity. |
| `fallGravityFactor` | `number` | `4` | Multiplier to increase falling speed. |
| `maxFallSpeed` | `number` | `50` | Maximum fall velocity cap. |
| `mass` | `number` | `1` | Virtual mass, affects float behavior. |
| `sleepTimeout` | `number` | `10` | Time before character enters sleep state when idle. |
| `slowMotionFactor` | `number` | `1` | Global time scaling (e.g., `0.5` = half-speed). |
| `turnSpeed` | `number` | `15` | Turn speed when changing direction. |
| `maxWalkSpeed` | `number` | `3` | Max speed when walking. |
| `maxRunSpeed` | `number` | `5` | Max speed when running. |
| `acceleration` | `number` | `30` | Speed increase per second. |
| `deceleration` | `number` | `20` | Speed decrease when input is released. |
| `counterAccFactor` | `number` | `0.5` | Extra acceleration multiplier when changing direction. |
| `airDragFactor` | `number` | `0.3` | Simulated drag while in air. |
| `jumpVel` | `number` | `5` | Upward velocity when jumping. |
| `floatCheckType` | `"RAYCAST"` \| `"SHAPECAST"` \| `"BOTH"` | `BOTH` | Able to switch between different float check type. |
| `maxSlope` | `number` | `1` | Max walkable surface slope (in radians). |
| `floatHeight` | `number` | `0.2` | Desired float height above ground. |
| `floatPullBackHeight` | `number` | `0.25` | Additional distance below ground used to pull character down. |
| `floatSensorRadius` | `number` | `0.12` | Radius of the sensor used to sense the ground. |
| `floatSpringK` | `number` | `600` | Spring constant for floating. |
| `floatDampingC` | `number` | `28` | Damping factor for float spring (prevents oscillation). |
| `collisionCheckIteration` | `number` | `3` | Number of collision check per frame. |
| `collisionPushBackVelocity` | `number` | `3` | Extra velocity applied to resolve penetration. |
| `collisionPushBackDamping` | `number` | `0.1` | Damping applied to the pushback force. |
| `collisionPushBackThreshold` | `number` | `0.005` | Minimum depth before pushback activates. |
## 🧱 Collider Component Props
| Prop | Type | Default | Description |
| ----------------------- | --------- | ------------- | ------------------------------------------------------------ |
| `debug` | `boolean` | `false` | Shows BVH bounds for debugging. |
| `debugVisualizeDepth` | `number` | `10` | Depth level of BVH to visualize (debug only). |
| `restitution` | `number` | `0.05` | Bounciness on impact. |
| `friction` | `number` | `0.8` | Surface friction against character movement. |
| `excludeFloatHit` | `boolean` | `false` | If true, this collider is ignored in float sensor checks. |
| `excludeCollisionCheck` | `boolean` | `false` | If true, this collider is excluded from collision detection. |
| `BVHOptions` | `object` | _(see below)_ | Configuration for building the internal BVH tree. |
Default BVHOptions:
```js
{
strategy: SAH,
verbose: false,
setBoundingBox: true,
maxDepth: 40,
maxLeafTris: 10,
indirect: false
}
```
## 🎮 Virtual Joystick and Button Integration
BVHEcctrl provides mobile-friendly UI components to control character movement and actions using touch input. Simply import and place `` and `` outside the `