So heres the thing, I have an actor(it has a simplified box collision) with 6 sockets. 1 for each side: up,down,left,right,etc. I want to be able to ray cast and when it hits the actor I want it to check which side it hit and if it hits the right side of the cube I can get the right socket’s transform and spawn another actor.
In short, I just want know which side the ray cast hit in a cube.
I’ve tried many things and it has work but it drained performance and so i want to know if there is a way more efficent way?
Hmm, I’m not an expert on that level but maybe you could create 6 box collisions, one for each side, and set them to block linetraces in their collision settings. Then in the line/ray trace, you check which component of those 6 box collisions you hit, and if you hit the box collision which is named “Left” for example, you know you hit the left side…
Take the dot product of the axes of the cube and the hit normal.
The hit normal is a vector in the direction of the surface that was hit.
The dot product of 2 vectors gives you the cosine value of the angle between the two vectors.
Eg. if you have 2 perpendicular vectors, the dot product will return 0. (Acos(0) is 90°)
So, to check if your trace hit the front or rear of the cube, take the X (forward) axis (a vector pointing in the direction of the cube’s front) of the cube, and dot it with the hit normal.
If it’s 1, the difference between the hit normal, and the forward vector is 0°, which tells you that it was hit on the front.
You may want to give some leeway, instead of relying on the hit normal being absolutely perfect (and thus hitting 0.0000°).
Below is a simple macro that uses a high value of 45°.
Let’s call it GetHitSideSingleAxis.
The function takes the dot product of the passed in vector (Eg. X (forward)) and the hit normal. If the hit normal is pointing in the same direction as the forward vector of the cube, the front was hit. If the hit normal is pointing in the opposite direction of the forward vector, it was hit in the rear.
0.7071 is approximately 45°
In case of X (forward), the macro will execute either Positive (forward), Negative (backwards) or neither, if the hitnormal is pointing neither forward nor rear.
Making a simple enum with all the sides (None,Front,Rear,Right,Left,Top,Bottom) we can make a simple function that returns which side was hit, given the axes of the cube, and the hit normal from the trace.
Let’s call it GetHitSide
The axes can be retrieved by getting the rotation of the cube, and using the GetAxes node.
In case you’re having trouble understanding the logic behind this:
That was the method I was using before. The thing is the next actor I spawn I also want to check the six sides , and as soon as I I get to 40 of the same actor frames start to drop, so yeah I don’t want to use that.
Ok so the good news i can finally clasify the side’s but the bad news is this:
Error Blueprint Runtime Error: Accessed None trying to read property CallFunc_BreakHitResult_HitActor from function: ‘ExecuteUbergraph_Character’ from node: Get Hit Side in graph: EventGraph in object: Character
But i fixed by just casting to the cube i want to hit. I’m really grateful for your help , ive been trying to do this for 2 weeks. Thanks!