Jump to content
  • Advertisement
Sign in to follow this  

How to know where light is projected or facing an object

This topic is 2032 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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

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
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);

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!