c++ - 将对象的 X 坐标归一化为更小或更大的坐标

标签 c++ math game-engine normalization formula

这几乎是一个与代码无关的问题。我不确定这是否是正确的术语,但我正在寻找执行此操作的公式。

基本上我的游戏中有一个矩形“网关”对象,可以在关卡之间转移玩家。

gateway 在我的例子中,我有两个“网关”矩形,矩形 A 是 1200 像素宽,矩形 B 是 330 像素宽。 (2个矩形宽度不同的原因是因为另一层的比例因子不同)

当“玩家”对象与矩形 A 碰撞时,它应该进入下一个级别并从矩形 B 退出,但是从与其进入相关的坐标(从矩形 A)但“标准化”以适合大小矩形 B.

最佳答案

我相信您正在寻找的是能够将第一个范围内的值的相对位置映射到另一个范围内的相应位置。

这是一个 C++ 函数,它获取两个范围的下限和上限以及您希望从范围一映射到范围二的输入值。有一种边缘情况,函数将除以零。如果检测到这种情况,它会返回一个位于超出范围中间的值。

inline float rangeMapFloat( float inRangeStart,
 float inRangeEnd,
 float outRangeStart,
 float outRangeEnd,
 float inValue ) 
{

    // Handle the zero edge case
    if ( inRangeStart == inRangeEnd  ) {
        return 0.50f * ( outRangeStart + outRangeEnd );
    }

    float outValue = inValue;

    outValue = outValue - inRangeStart;
    outValue = outValue / ( inRangeEnd - inRangeStart );
    outValue = outValue * ( outRangeEnd - outRangeStart );
    outValue = outValue + outRangeStart;

    return outValue;

} 

例如,如果您的较大矩形宽度为 0-1200 像素,较小矩形宽度为 0-400 像素,并且玩家与较大矩形的像素 800 发生碰撞,则函数调用如下所示;

float teleportLocationWithinNewRect = rangeMapFloat( 0.0f, 1200.0f, 0.0f, 400.0f, 800.0f );

在这种情况下,800.0f 是大矩形宽度的 2/3,因此返回的值将是 400.0f 值的 2/3 (~ 266.7f)。

关于c++ - 将对象的 X 坐标归一化为更小或更大的坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23477916/

相关文章:

math - 一个人的补充,而不只是比特的总和

java - LibGDX FrameBuffer 到TextureRegion 正在渲染不正确的 Sprite

matlab - 如何在 Matlab 中多次加入同一个矩阵以制作一个大矩阵?

java - 更改在 Eclipse 中运行哪个 main()

iphone - openGL 中的 3d 游戏开发人员

python - 嵌入 Python Zip 文件会抛出错误?

c++ - 原子 "check signal and enter system call"操作

c++ - 如何在gradle native 项目中包含二进制库?

c++ - 在编译期间包含未使用的代码

c++ - 编译> 2 GB的代码时如何修复GCC编译错误?