1

不幸的是,我的数学知识非常令人沮丧,但我真的很想了解我必须通过用鼠标拖动来控制 Actor 的代码。此代码还可以用作通过在屏幕上单击鼠标将对象放置在世界中的方式。

首先-代码效果很好,更多的是关于向量代数而不是虚幻引擎的问题。我迷路了,我什至不知道如何正确命名变量哈哈

因此,这是我从我发现的一个蓝图示例转换而来的代码,它实现了我需要的功能:

    FVector WorldLocation;
    FVector WorldDirection;
    PlayerController->DeprojectMousePositionToWorld(WorldLocation, WorldDirection);

    // Have no idea how it works but it works! I really need to learn more about vector Algebra :(((
    float DistanceAboveGround = 200.0f;
    float NotSureWhyThisValue = -1.0f;
    float WhyThisOperation = WorldLocation.Z / WorldDirection.Z + DistanceAboveGround;

    FVector IsThisNewWorldDirection = WorldDirection * WhyThisOperation * NotSureWhyThisValue;
    FVector ActorWorldLocation = WorldLocation + IsThisNewWorldDirection;            
    // end of "Have no idea how it works" code
    Capsule->SetWorldLocation(ActorWorldLocation);

如果有人能解释一下为什么我需要做这些以//不知道..注释行为主角的操作?如果我能理解如何正确命名“NotSureWhyThisValue”、“WhatDoesItMean”、“WhyThisOperation”和“IsThisNewWorldDirection”?这对我来说将是一个巨大的进步,完美的情况是解释每一行......

提前致谢!

4

1 回答 1

1

这只是 FMath::LinePlaneIntersection的重新实现,它只是采用某些捷径,因为平面的法线是 (0,0,1):

FVector WorldLocation;
FVector WorldDirection;
float DistanceAboveGround = 200.0f;

PlayerController->DeprojectMousePositionToWorld(WorldLocation, WorldDirection); 

FVector PlaneOrigin(0.0f, 0.0f, DistanceAboveGround);

FVector ActorWorldLocation = FMath::LinePlaneIntersection(
            WorldLocation,
            WorldLocation + WorldDirection,
            PlaneOrigin,
            FVector::UpVector);

Capsule->SetWorldLocation(ActorWorldLocation);

如果您想更好地理解数学,请参阅 Bas Smit 的这个答案(复制如下):

Vector3 Intersect(Vector3 planeP, Vector3 planeN, Vector3 rayP, Vector3 rayD)
{
    var d = Vector3.Dot(planeP, -planeN);
    var t = -( d 
            + rayP.z * planeN.z 
            + rayP.y * planeN.y 
            + rayP.x * planeN.x) 
          / (rayD.z * planeN.z 
            + rayD.y * planeN.y 
            + rayD.x * planeN.x);
    return rayP + t * rayD;
}

基本上,WhyThisOperation结果是-t,然后乘以 -1 得到t,然后乘以WorldDirection( rayD) 并加到WorldPosition( rayP) 得到交点。

于 2019-11-19T01:21:34.017 回答