How to know where light is projected or facing an object

Started by
-1 comments, last by AhmedCoeia 10 years ago

I have an object, actually its a bicycle, and I have a directional light source in the scene. I would like to know from the light source directional vector and object's orientation, where the light is affecting the object, so that I can project the blue quad on the side of the projection.

The shadow actually is consisted of two quads A X C

B X D

Where X's are the center of the bike, and I calculated them as my current position + forward vector or - forward vector's length.


If the bicycle is facing the light source, the quad should be projected and reflected on the surface of the ray of the incidents, otherwise, it should be in the other side, at the same time based on how much is the light on each side, the relevant quad should be stretched and the other quad should be scaled down, to simulate a fake shadow effect.

I have written a code for it, but the scaling of the shadow is not stable at all, like one side scales up or down, and the other gets stretched,..etc

mLean is a variable from -0.5f to 0.5f, that determines how much is the biker has leaned by pressing the key left or right.


// LightDir.Up Model vector
float leaningAngleUpVector = Vector3.Dot(lightDir.normalized, Source.transform.up.normalized);
float lightAngleRightVector = Vector3.Dot(lightDir.normalized, Source.transform.right.normalized);

Global.Log("Current Leaning" + leaningAngleUpVector.ToString("0.00"));
Global.Log("incidentLightAngle" + lightAngleRightVector.ToString("0.00"));

// light projected left side
if (lightAngleRightVector < 0)
{
if (mLean > 0.1f)
{
Global.Log("I'm leaning left");
vxCDRight = Mathf.Clamp(mLean, 0, 0.3f); // shrink left side 0.5f<lean>-0.5f
vxABLeft = Mathf.Lerp(0, Mathf.Clamp(leaningAngleUpVector, 0, 0.4f), Time.deltaTime * 4); // extend the other side



}
else
{
vxABLeft = -Mathf.Clamp(Mathf.Abs(lightAngleRightVector), 0, 0.4f);
vxCDRight = 0;
Global.Log("left leaning only");

}


}

// light projected right side
else if (lightAngleRightVector > 0)
{
if (mLean < -0.1f)
{
Global.Log("Im leaning Right");
vxABLeft = Mathf.Clamp(mLean, -0.3f, 0); // shrink left side 0.5f<lean>-0.5f
vxCDRight = -Mathf.Lerp(0, Mathf.Clamp(leaningAngleUpVector, -0.4f, 0), Time.deltaTime * 4); // extend the other side
}
else
{
vxCDRight = Mathf.Clamp(lightAngleRightVector, 0, 0.4f);
vxABLeft = 0;

Global.Log("Right leaning only");
}

}
Vector3 vxPos1Top = pos + rot * (new Vector3(-offsetX + vxABLeft, 0, offsetY) * scale); // 1,2 vertices or on its left
Vector3 vxPos2Top = pos + rot * (new Vector3(-offsetX + vxABLeft, 0, -offsetY) * scale);
Vector3 vxPos3Top = pos + mForward.GetVector3().normalized * mMiddleScale; // two middle vertices
Vector3 vxPos4Top = pos - mForward.GetVector3().normalized * mMiddleScale;
Vector3 vxPos5Top = pos + rot * (new Vector3(offsetX + vxCDRight, 0, offsetY) * scale); // 5,6 vertices are on the right of the bikeer
Vector3 vxPos6Top = pos + rot * (new Vector3(offsetX + vxCDRight, 0, -offsetY) * scale);

This topic is closed to new replies.

Advertisement