bool CreatureCore::IsBluePrintBonesCollide(FVector test_point, float bone_size, FTransform base_transform) { if (bone_size <= 0) { bone_size = 1.0f; } FTransform xform = base_transform; FVector local_test_point = xform.InverseTransformPosition(test_point); auto render_composition = creature_manager->GetCreature()->GetRenderComposition(); auto& bones_map = render_composition->getBonesMap(); glm::vec4 real_test_pt(local_test_point.X, local_test_point.Y, local_test_point.Z, 1.0f); for (auto cur_data : bones_map) { auto cur_bone = cur_data.second; auto bone_start_pt = cur_bone->getWorldStartPt(); auto bone_end_pt = cur_bone->getWorldEndPt(); auto bone_vec = bone_end_pt - bone_start_pt; auto bone_length = glm::length(bone_vec); auto bone_unit_vec = bone_vec / bone_length; auto rel_vec = real_test_pt - bone_start_pt; float proj_length_u = glm::dot(rel_vec, bone_unit_vec); if (proj_length_u >= 0 && proj_length_u <= bone_length) { // quick rotation by 90 degrees auto bone_unit_normal_vec = bone_unit_vec; bone_unit_normal_vec.x = -bone_unit_vec.y; bone_unit_normal_vec.y = bone_unit_vec.x; float proj_length_v = fabs(glm::dot(rel_vec, bone_unit_normal_vec)); if (proj_length_v <= bone_size) { return true; } } } return false; }
void ACreatureActor::FillBoneData() { auto render_composition = creature_manager->GetCreature()->GetRenderComposition(); auto& bones_map = render_composition->getBonesMap(); if (bone_data.Num() == 0) { bone_data.SetNum(bones_map.size()); } int i = 0; for (auto& cur_data : bones_map) { bone_data[i].name = FString(cur_data.first.c_str()); auto pt1 = cur_data.second->getWorldStartPt(); auto pt2 = cur_data.second->getWorldEndPt(); bone_data[i].point1 = FVector(pt1.x, pt1.y, pt1.z); bone_data[i].point2 = FVector(pt2.x, pt2.y, pt2.z); i++; } }
void CreatureCore::FillBoneData() { auto render_composition = creature_manager->GetCreature()->GetRenderComposition(); auto& bones_map = render_composition->getBonesMap(); if (bone_data.Num() == 0) { bone_data.SetNum(bones_map.size()); } int i = 0; for (auto& cur_data : bones_map) { bone_data[i].name = FString(cur_data.first.c_str()); auto pt1 = cur_data.second->getWorldStartPt(); auto pt2 = cur_data.second->getWorldEndPt(); /* Id References const int x_id = 0; const int y_id = 2; const int z_id = 1; */ bone_data[i].point1 = FVector(pt1.x, pt1.y, pt1.z); bone_data[i].point2 = FVector(pt2.x, pt2.y, pt2.z); // figure out bone transform auto cur_bone = cur_data.second; auto bone_start_pt = pt1; auto bone_end_pt = pt2; auto bone_vec = bone_end_pt - bone_start_pt; auto bone_length = glm::length(bone_vec); auto bone_unit_vec = bone_vec / bone_length; // quick rotation by 90 degrees auto bone_unit_normal_vec = bone_unit_vec; bone_unit_normal_vec.x = -bone_unit_vec.y; bone_unit_normal_vec.y = bone_unit_vec.x; FVector bone_midpt = (bone_data[i].point1 + bone_data[i].point2) * 0.5f; FVector bone_axis_x(bone_unit_vec.x, bone_unit_vec.y, 0); FVector bone_axis_y(bone_unit_normal_vec.x, bone_unit_normal_vec.y, 0); FVector bone_axis_z(0, 0, 1); FTransform scaleXform(FVector(0, 0, 0)); scaleXform.SetScale3D(FVector(bone_length * bone_data_length_factor, bone_data_size, bone_data_size)); //std::swap(bone_midpt.Y, bone_midpt.Z); FTransform fixXform; fixXform.SetRotation(FQuat::MakeFromEuler(FVector(-90, 0, 0))); FTransform rotXform(bone_axis_x, bone_axis_y, bone_axis_z, FVector(0, 0, 0)); FTransform posXform, posStartXform, posEndXform; posXform.SetTranslation(bone_midpt); posStartXform.SetTranslation(bone_data[i].point1); posEndXform.SetTranslation(bone_data[i].point2); // bone_data[i].xform = scaleXform * FTransform(bone_axis_x, bone_axis_y, bone_axis_z, bone_midpt); bone_data[i].xform = scaleXform * rotXform * posXform * fixXform; bone_data[i].startXform = scaleXform * rotXform * posStartXform * fixXform; bone_data[i].endXform = scaleXform * rotXform * posEndXform * fixXform; i++; } }