JSPM

@quenty/camera

9.21.1-canary.417.052e8ba.0
  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 122
  • Score
    100M100P100Q72599F
  • License MIT

Quenty's camera system for Roblox

Package Exports

    This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@quenty/camera) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

    Readme

    Camera

    CameraStackService provides a camera stack of objects that can report a camera state. This allows a composable camera system for a variety of situations that arise, and lets systems interop with each other

    Installation

    npm install @quenty/camera --save

    Features

    • Minor VR support
    • Support for composable camera types
    • Support for interpolation between camera nodes
    • Support for touch and gamepad support and controls
    • Support for camera shake

    Camera State

    CameraState is an immutable camera system used for camera interpolation. Designed to make camera effects easy, it trades some efficiency and speed for making a not confusing camera system.

    Camera state stores internal state of Coordinate frames as quaternions. This means that the classic lerp equation. Operations have been overridden to make this easier to work with.

    Ok. It's not entirely immutable. They are kind of lazy, that is, reading data doesn't affect the state of them. There are no required update loops or anything for the most part.

    Camera effect API

    Current Camera Effects have the following API available. Adding new effects means that these two should follow the same API specifications

    Add + operator

    Returns a new Summed camera and adds the two effects together. This is used for combining effects

    .CameraState

    Indexing the CameraEffect should return the current camera state. This means that state is easy to index.

    In previous versions, the following will also work. However, this is no longer true.

    • .State
    • .CameraState
    • .Camera

    This will return a CameraState

    !!! warning Note that eventually we plan to deprecate everything but .CameraState

    DefaultCamera

    This class tracks the current camera ROBLOX uses and lets it maintain how it operates using a BindToRenderStep trick.

    • Should call BindToRenderStep during construction
    • Only one should exist at once per client (not enforced in code, however)

    SummedCamera

    This class takes two arguments and returns the summation of the two

    • Arguments can be either CameraState or a CameraEffect, assuming the effect has a CameraState member

    FadingCamera

    This classes allows the effects of a camera to be faded / varied based upon a spring

    • Starts at 0 percent effect

    Usage

    Here is sample usage of using just a subcomponent. Recommendation is to use full camera stack service.

    local RunService = game:GetService("RunService")
    local Workspace = game:GetService("Workspace")
    
    local FadeBetweenCamera3 = require(modules.FadeBetweenCamera3)
    local CustomCameraEffect = require(modules.CustomCameraEffect)
    local CameraState = require(modules.CameraState)
    
    local defaultCamera = require(modules.DefaultCamera).new()
    defaultCamera:BindToRenderStep() -- capture roblox camera automatically
    
    local targetCamera = CustomCameraEffect.new(function()
      local target = CameraState.new()
      target.CFrame = CFrame.new(0, 100, 0)
      target.FieldOfView = 70
    
      return target
    end)
    
    local faded = FadeBetweenCamera3.new(defaultCamera, targetCamera)
    faded.Speed = 5
    
    RunService:BindToRenderStep("CameraStackUpdateInternal", Enum.RenderPriority.Camera.Value + 75, function()
      faded.CameraState:Set(Workspace.CurrentCamera)
    end)
    
    -- Input
    local mouse = game.Players.LocalPlayer:GetMouse()
    local visible = false
    mouse.Button1Down:Connect(function()
      visible = not visible
      if visible then
        faded.Target = 1
      else
        faded.Target = 0
      end
    end)