Author Topic: Source Code for my Corner/Edge Detection  (Read 1469 times)

Code: [Select]
//Edge Detection and Rotation
function Player::BoundaryCheck(%obj)
{
if(%obj.isHanging || %obj.isClimbing)
{
// talk("Boundary Check loop");
// centerPrint(%obj.client,"<font:impact:24><br><br><br><br><color:FFF200><just:right>Boundary Check Loop ",0.1);
if(!%obj.isLeaping)
{
%obj.grabchk2 = %obj.schedule(5,GrabCheck);
// talk("Secondary Grab Check");
// bottomPrint(%obj.client,"<font:impact:24><br><br><br><br><color:FFF200><just:right>Secondary Grab Check scheduled ",0.1);
}
cancel(%obj.bcheck);
%obj.bcheck = %obj.schedule(10,BoundaryCheck);
if(%obj.isHanging)
{
cancel(%obj.dirfix);
%obj.dirfix = %obj.schedule(5,DirectionalFix);
}
%vec = %obj.getForwardVector();
%vel = %obj.getVelocity();
%pos = %obj.getPosition();
%rv = relativevelocity(%vec,%vel);
%lvec = %obj.getLeftVector();
%rvec = %obj.getRightVector();
%x = getWord(%rv,0);
%y = getWord(%rv,1);
%z = getWord(%vel,2);
%up = getWord(%pos,2);
%fwdX = getWord(%vec,0);
%fwdY = getWord(%vec,1);
if(%x > 5)
{
%obj.setVelocity(vectorScale(%dv,0.25) SPC %upv);
}
if(%x < -5)
{
%obj.setVelocity(vectorScale(%dv,0.25) SPC %upv);
}
if(%x > 0.1)
{
%xAdd = 0.2;
%xAdd2 = 1;
%xSub = -0.1;
%sv = %lvec;
}
else if(%x < -0.1)
{
%xAdd = -0.2;
%xAdd2 = -1;
%xSub = 0.1;
%sv = %rvec;
}
%ap = (%xAdd * %fwdY + %yAdd * %fwdX) SPC (%yAdd * %fwdY + %xAdd * -%fwdX) SPC %zAdd;
%ap2 = (%xAdd2 * %fwdY + %yAdd2 * %fwdX) SPC (%yAdd2 * %fwdY + %xAdd2 * -%fwdX) SPC %zAdd2;
%sp = (%xSub * %fwdY + %ySub * %fwdX) SPC (%ySub * %fwdY + %xSub * -%fwdX) SPC %zSub;
%ledgePos = vectorAdd(%obj.getHackPosition(),"0 0 0.15");
%startA = vectorAdd(%ledgePos,%ap);
%beam = vectorScale(%vec,1);
%endA = vectorAdd(%startA, %beam);
%rayA = containerRayCast(%startA, %endA, $TypeMasks::fxBrickObjectType | $TypeMasks::TerrainObjectType | $Typemasks::VehicleObjectType, %obj);
%spacePos = vectorAdd(%obj.getEyePoint(),"0 0 -0.55");
%startB = vectorAdd(%spacePos,%ap);
%endB = vectorAdd(%startB, %beam);
%rayB = containerRayCast(%startB, %endB, $TypeMasks::fxBrickObjectType | $TypeMasks::TerrainObjectType | $Typemasks::VehicleObjectType, %obj);
%ledgePos = vectorAdd(%obj.getHackPosition(),"0 0 0.15");

%endC = vectorAdd(%ledgePos, %beam);
%rayC = containerRayCast(%ledgePos, %endC, $TypeMasks::fxBrickObjectType | $TypeMasks::TerrainObjectType | $Typemasks::VehicleObjectType, %obj);
%endD = vectorAdd(%spacePos, %beam);
%rayD = containerRayCast(%spacePos, %endD, $TypeMasks::fxBrickObjectType | $TypeMasks::TerrainObjectType | $Typemasks::VehicleObjectType, %obj);
if(!%obj.isClimbing && %obj.isHanging)
{
%startA2 = %ledgePos;
%beam2 = vectorScale(%sv,1);
%endA2 = vectorAdd(%startA2, %beam2);
%rayA2 = containerRayCast(%startA2, %endA2, $TypeMasks::fxBrickObjectType | $TypeMasks::TerrainObjectType | $Typemasks::VehicleObjectType, %obj);
%startB2 = %spacePos;
%endB2 = vectorAdd(%startB2, %beam2);
%rayB2 = containerRayCast(%startB2, %endB2, $TypeMasks::fxBrickObjectType | $TypeMasks::TerrainObjectType | $Typemasks::VehicleObjectType, %obj);
if(isObject(%colA2 = firstWord(%rayA2)) && !isObject(%colB2 = firstWord(%rayB2)) && !%obj.isRotated)
{
if(%x < 5 && %x > 0)
{
%sideRotation = "0 0 -90";
}
if(%x > -5 && %x < 0)
{
%sideRotation = "0 0 90";
}
%obj.sideRotation = %sideRotation;
%obj.Rotate90();
return;
}
%new3 = vectorAdd(VectorScale(%ap,1),vectorScale(%vec,1));
%startA3 = vectorAdd(%ledgePos,%new3);
%beam3 = vectorScale(%sv,-0.5);
%endA3 = vectorAdd(%startA3, %beam3);
%rayA3 = containerRayCast(%startA3, %endA3, $TypeMasks::fxBrickObjectType | $TypeMasks::TerrainObjectType | $Typemasks::VehicleObjectType, %obj);
%startB3 = vectorAdd(%spacePos,%new3);
%endB3 = vectorAdd(%startB3, %beam3);
%rayB3 = containerRayCast(%startB3, %endB3, $TypeMasks::fxBrickObjectType | $TypeMasks::TerrainObjectType | $Typemasks::VehicleObjectType, %obj);
if(isObject(%colA3 = firstWord(%rayA3)) && !isObject(%colB3 = firstWord(%rayB3)))
{
if(!isObject(%colA = firstWord(%rayA)) || isObject(%colB = firstWord(%rayB)))
{
%newVector = vectorAdd(vectorScale(%ap2,0.8),vectorScale(%vec,1));
%start = vectorAdd(%obj.getHackPosition(),%newVector);
initContainerBoxSearch(%start, "1.3 1.3 1.6", $TypeMasks::fxBrickObjectType | $TypeMasks::TerrainObjectType | $Typemasks::VehicleObjectType);
%colD = containerSearchNext();
if(!isObject(%colD) && !%obj.isRotated)
{
if(%x < 5 && %x > 0)
{
%sideRotation = "0 0 90";
}
if(%x > -5 && %x < 0)
{
%sideRotation = "0 0 -90";
}
%add = vectorAdd(%pos,"0 0 0.0");
%obj.setVelocity("0 0 0");
%obj.setTransform(vectorAdd(%add,%newVector));
%obj.sideRotation = %sideRotation;
%obj.Rotate90();
return;
}
}
}
}
if(!isObject(%colA = firstWord(%rayA)) || isObject(%colB = firstWord(%rayB)))
{
if(isObject(%colC = firstWord(%rayC)) && !isObject(%colC = firstWord(%rayD)))
{
if(!%obj.isRotated)
{
%obj.setTransform(vectorAdd(%pos,%sp));
}
}
}
}
}

Thanks for posting some of your code, I'll help get it all into a repository later.

uuh what

what does this do exactly

A brief explaination would be great, as your work is always good.

It says:
1. If there is no ledge beside me, don't let me go there.
2. If there is no ledge, but there is a corner and nothing in the way, go around the corner.
3. If there is a ledge and there is also a ledge directly to the right or left of me, go around the inside corner.

It also has a hook for locking the player's view point in front of the wall, so he/she doesn't accidentally fall off.

He's got this neat ledge climbing ability going on in his server that actually works pretty well. I was trying to convince him to release the code since it looked like someone else might make good use of it. This is just part of the code, he needs to get it in a repository since he's still working on it.

Code: [Select]
package MiscFunctions
{
//Rotate 180°
function Player::TurnAround(%obj)
{
%eulerRotation = axisToEuler(getWords((%transform = %obj.getTransform()),3,6));
%eulerXY = getWords(%eulerRotation,0,1);
%eulerZ = getWord(%eulerRotation,2);
if(%eulerZ <= 0)
{
%eulerZ += 180;
}
else
{
%eulerZ -= 180;
}
%oppositeEulerRot = %eulerXY SPC %eulerZ;
%obj.setTransform(getWords(%transform,0,2) SPC eulerToAxis(%oppositeEulerRot));
}
//Rotational Code
function eulerToAxis(%euler)
{
%euler = VectorScale(%euler,$pi / 180);
%matrix = MatrixCreateFromEuler(%euler);
return getWords(%matrix,3,6);
}
function axisToEuler(%axis)
{
%angleOver2 = getWord(%axis,3) * 0.5;
%angleOver2 = -%angleOver2;
%sinThetaOver2 = mSin(%angleOver2);
%cosThetaOver2 = mCos(%angleOver2);
%q0 = %cosThetaOver2;
%q1 = getWord(%axis,0) * %sinThetaOver2;
%q2 = getWord(%axis,1) * %sinThetaOver2;
%q3 = getWord(%axis,2) * %sinThetaOver2;
%q0q0 = %q0 * %q0;
%q1q2 = %q1 * %q2;
%q0q3 = %q0 * %q3;
%q1q3 = %q1 * %q3;
%q0q2 = %q0 * %q2;
%q2q2 = %q2 * %q2;
%q2q3 = %q2 * %q3;
%q0q1 = %q0 * %q1;
%q3q3 = %q3 * %q3;
%m13 = 2.0 * (%q1q3 - %q0q2);
%m21 = 2.0 * (%q1q2 - %q0q3);
%m22 = 2.0 * %q0q0 - 1.0 + 2.0 * %q2q2;
%m23 = 2.0 * (%q2q3 + %q0q1);
%m33 = 2.0 * %q0q0 - 1.0 + 2.0 * %q3q3;
return mRadToDeg(mAsin(%m23)) SPC mRadToDeg(mAtan(-%m13, %m33)) SPC mRadToDeg(mAtan(-%m21, %m22));
}
//Relative Velocity
function relativeVelocity(%dirVec, %velVec)
{
%pi = 4 * mAtan(1, 1);
%horMag = VectorLen(getWords(%velVec, 0, 1) SPC 0);
%dirAng = mATan(getWord(%dirVec, 1), getWord(%dirVec, 0));
%velAng = mATan(getWord(%velVec, 1), getWord(%velVec, 0));
%relAng = %velAng - %dirAng + %pi/2;
%relVec = VectorAdd(VectorScale(mCos(%relAng) SPC mSin(%relAng) SPC 0, %horMag), "0 0" SPC getWord(%velVec, 2));
}
//Relative Vector
function Player::getLeftVector(%obj)
{
return vectorCross(%obj.getEyeVector(),%obj.getUpVector());
}
function Player::getRightVector(%obj)
{
return vectorScale(%obj.getLeftVector(%obj),-1);
}
};activatePackage(MiscFunctions);
Here's some of the misc. functions I use.