Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Help with CFrame?

Asked by 9 years ago

So I was trying this cool module I found and I got a error saying:

Workspace.CFrameInterpolator:23: bad argument #1 to 'inverse' (CFrame expected, got userdata)

I don't get why it saying this because I keep giving a CFrame value,how do I fix it?

What I put in the output:

Module = require(workspace.CFrameInterpolator) 
Module.new(game.Workspace.Part.CFrame,game.Workspace.Part1.Position)

Module:

--[[
    OUT: CFrameInterpolator

    CFrameInterpolator
        .new(CFrame a, CFrame b) {CFrameInterpolator Function(Number alpha) {CFrame result}}
--]]
-- Optimized CFrame interpolator module ~ by Stravant
-- Based off of code by Treyreynolds posted on the Roblox Developer Forum
local CFrameInterpolator = {}

local fromAxisAngle = CFrame.fromAxisAngle
local components = CFrame.new().components
local inverse = CFrame.new().inverse
local v3 = Vector3.new
local acos = math.acos
local sqrt = math.sqrt
local invroot2 = 1/math.sqrt(2)

CFrameInterpolator.new = function(c0, c1) -- (CFrame from, CFrame to) -> (float theta, (float fraction -> CFrame between))
    -- The expanded matrix
    local _, _, _, xx, yx, zx, 
                   xy, yy, zy, 
                   xz, yz, zz = components(inverse(c0)*c1)

    -- The cos-theta of the axisAngles from 
    local cosTheta = (xx + yy + zz - 1)/2

    -- Rotation axis
    local rotationAxis = v3(yz-zy, zx-xz, xy-yx)

    -- The position to tween through
    local positionDelta = (c1.p - c0.p)

    -- Theta
    local theta;            

    -- Catch degenerate cases
    if cosTheta >= 0.999 then
        -- Case same rotation, just return an interpolator over the positions
        return function(t)
            return c0 + positionDelta*t
        end, 0
    elseif cosTheta <= -0.999 then
        -- Case exactly opposite rotations, disambiguate
        theta = math.pi
        xx = (xx + 1) / 2
        yy = (yy + 1) / 2
        zz = (zz + 1) / 2
        if xx > yy and xx > zz then
            if xx < 0.001 then
                rotationAxis = v3(0, invroot2, invroot2)
            else
                local x = sqrt(xx)
                xy = (xy + yx) / 4
                xz = (xz + zx) / 4
                rotationAxis = v3(x, xy/x, xz/x)
            end
        elseif yy > zz then
            if yy < 0.001 then
                rotationAxis = v3(invroot2, 0, invroot2)
            else
                local y = sqrt(yy)
                xy = (xy + yx) / 4
                yz = (yz + zy) / 4
                rotationAxis = v3(xy/y, y, yz/y)
            end 
        else
            if zz < 0.001 then
                rotationAxis = v3(invroot2, invroot2, 0)
            else
                local z = sqrt(zz)
                xz = (xz + zx) / 4
                yz = (yz + zy) / 4
                rotationAxis = v3(xz/z, yz/z, z)
            end
        end
    else
        -- Normal case, get theta from cosTheta
        theta = acos(cosTheta)
    end

    -- Return the interpolator
    return function(t)
        return c0*fromAxisAngle(rotationAxis, theta*t) + positionDelta*t
    end, theta
end
--
--
return CFrameInterpolator

1 answer

Log in to vote
1
Answered by
Merely 2122 Moderation Voter Community Moderator
9 years ago

Well, look at the function definition in the ModuleScript.

CFrameInterpolator.new = function(c0, c1)

It takes a start CFrame and an end CFrame. You gave it a start CFrame and an end Vector3.

0
I got no error but it doesn't seem to work:Module = require(workspace.CFrameInterpolator) Test = Module.new(game.Workspace.Part.CFrame,game.Workspace.Part1.CFrame) print(Test) kevinnight45 550 — 9y
0
What am I doing wrong? kevinnight45 550 — 9y
Ad

Answer this question