Home Game Development sprites – How to detect colored pixel of Sprite3D texture with perspective camera ray?

sprites – How to detect colored pixel of Sprite3D texture with perspective camera ray?

0
sprites – How to detect colored pixel of Sprite3D texture with perspective camera ray?

[ad_1]

I’ve tried to ray cast my mouse position to Sprite3D on screen but I have some problems with it.

func _input(event):
    if event is InputEventMouse:
        mouse = event.position
    if event is InputEventMouseButton and event.pressed:
        if event.button_index == MOUSE_BUTTON_LEFT:
            get_selection()

func get_selection():
    var worldspace = player.camera_3d.get_world_3d().direct_space_state
    var start = player.camera_3d.project_ray_origin(mouse)
    var end = player.camera_3d.project_position(mouse, 1000)
    
    var query = PhysicsRayQueryParameters3D.create(start, end)

    var result = worldspace.intersect_ray(query)

Brief setting of my project
My character/enemy is a Sprite3D in CharacterBody3D with small collision box only on its feet. I want the mouse to detect the shape of colored pixels of my character/enemy I saw on screen but intersect_ray() always return with collider in the object, so it went through the character to the floor object instead.

Why I don’t set the collision box to match the height of sprite?
Camera is attached to player with 45 degree angle looking down to the player and it can zoom-in-out and tilt then it will look_at() player again at its new position. While tilting, character’s visual is also tilted to parallel with camera. So I think its collision box couldn’t be the same size as sprite because sprite’s height will be changing all the time and collision box cannot be tilted into the ground too.

visuals.rotation.x = camera_3d.rotation.x

So my question is…
Is there a way to do a manual raycasting? or to calculate colored pixels’ positions from characters/enemy on screen compare to mouse position and know if it’s player or enemy. Please keep in mind that camera can zoom-in or zoom-out and tilting.

Thank you in advance

[ad_2]