Help me. Rotate cube in relation to the other's face [SOLVED]

I’m in trouble and I hope someone can help me. I am doing a construction system. With Raycast I use the normal face of a cube where the hit happens and position another cube on this face. Based on the axis difference, I find an angle then even if a cube is inclined the cube to be built appears with the correct rotation.

The problem is that when I rotate this cube it is lined with the cube exists. I had already managed to do this in the Engine tank. But deciding to do in Armory because of physics to apply the same logic I’m not succeeding.

The first thing is that the axles are directed. The vertical axis of armor is Z and the bears is Y. I already changed this by applying the logic of Z to Y and Y in Z. But I’m not trying to be successful. When rotating the cube at the wax outside the game I noticed that I rotate it with local rotation. Everything works, but using Node> Transform, Rotate Object, even selected local F.O.R. it rotates on the global axis.

Well if anyone can help me please. Tell me how to solve this or how I can make the cube rotate on the local axis.

source original:

Calculate the differences in positions

        entity_pos = hit_info.entity.position
        entity_rot = hit_info.entity.rotation
        diff_x = entity_pos.x - cube_ghost.position.x
        diff_y = entity_pos.y - cube_ghost.position.y
        diff_z = entity_pos.z - cube_ghost.position.z

        # Calcule a diferença máxima
        diff_max = max(abs(diff_x), abs(diff_y), abs(diff_z))

        # Determine the main axis based on the maximum difference
        if diff_max == abs(diff_x):
            #print('# O eixo é X')entity_pos
            #angle_degrees = math.degrees(math.atan2(diff_z, diff_x)) #+ math.pi 
            ghost_rotation = Vec3(angle_to_rotation, 0, 0)
        elif diff_max == abs(diff_y):
            if entity_pos.y > cube_ghost.position.y:
                #print(' - Y')
                angle_degrees = math.degrees(math.atan2(diff_z, diff_y) - math.pi / 2) 
                ghost_rotation = Vec3(angle_degrees, 0, angle_to_rotation)
            else:
                #print(' + Y')
                angle_degrees = math.degrees(math.atan2(diff_z, diff_y) + math.pi / 2) 
                ghost_rotation = Vec3(angle_degrees, 0, angle_to_rotation)

        elif diff_max == abs(diff_z):
            #print(':: Z')
            angle_degrees = math.degrees(math.atan2(diff_y, diff_z))
            ghost_rotation = Vec3(angle_degrees*-1, 0, angle_to_rotation)


        cube_ghost.visible = True 
        ghost_position = hit_info.entity.position + hit_info.world_normal
        cube_ghost.position = ghost_position
        cube_ghost.rotation = ghost_rotation

I did the same with an Armorry look script. But it doesn’t work the same.

1 Like

I found the solution by multiplying rotations and using the Axis option of the “rotation” node

The variable “rotation_direction” is a vert that must have 1 in the desired exei. The variable rotation_ghost is the value that should be added or shifted from the angle. The variable “done_rotation” is the angle that is using the Atan2.

@mokauno, I believe you were looking for this

1 Like