0

我很难进行正确的计算,以便在 2D 坐标中放大屏幕中心,同时将所有内容保持在正确的比例。

我有一个向量,我用它来处理在我的地图编辑器中移动,如下所示:

scroll = sf::Vector2<float>(-640.0f, -360.0f);

它设置为 -640.0f、-360.0f 以使 0,0 在初始化时成为屏幕的中心(基于我的窗口为 1280x720)。

我的缩放值范围从 0.1f 到 2.0f,并且以 0.05 的增量增加或减少:

zoomScale = zoomScale + 0.05;

当在屏幕上绘制元素时,它们是使用以下代码绘制的:

sf::Rect<float> dRect;
dRect.left = (mapSeg[i]->position.x - scroll.x) * (layerScales[l] * zoomScale);
dRect.top = (mapSeg[i]->position.y - scroll.y) * (layerScales[l] * zoomScale);
dRect.width = (float)segDef[mapSeg[i]->segmentIndex]->width;
dRect.height = (float)segDef[mapSeg[i]->segmentIndex]->height;

sf::Sprite segSprite;
segSprite.setTexture(segDef[mapSeg[i]->segmentIndex]->tex);
segSprite.setPosition(dRect.left, dRect.top);
segSprite.setScale((layerScales[l] * zoomScale), (layerScales[l] * zoomScale));
segSprite.setOrigin(segDef[mapSeg[i]->segmentIndex]->width / 2, segDef[mapSeg[i]->segmentIndex]->height / 2);
segSprite.setRotation(mapSeg[i]->rotation);
Window.draw(segSprite);

layerScales 是一个用于放大视差滚动的分段层的值。

这在放大和缩小时似乎工作正常,但中心点似乎发生了变化(我知道应该始终位于 0,0 的元素在我放大后将位于不同的坐标处)。我使用以下来计算鼠标的位置来测试如下:

mosPosX = ((float)input.mousePos.x + scroll.x) / zoomScale)
mosPosY = ((float)input.mousePos.y + scroll.y) / zoomScale)

我确信我应该对“滚动”向量进行计算以考虑到这种缩放,但我似乎无法让它正常工作。

我尝试实现类似下面的东西,但它没有产生正确的结果:

scroll.x = (scroll.x - (SCREEN_WIDTH / 2)) * zoomScale - (scroll.x - (SCREEN_WIDTH / 2));
scroll.y = (scroll.y - (SCREEN_HEIGHT / 2)) * zoomScale - (scroll.y - (SCREEN_HEIGHT / 2));

任何想法我做错了什么?

4

1 回答 1

0

我会用简单的方法(不是最有效但工作正常)并且仅适用于单轴(第二个相同)

最好有未缩放的偏移量:

scaledpos = (unscaledpos*zoomscale)+scrolloffset

知道中心点在比例变化后不应该移动(0 表示之前 1 表示之后):

scaledpos0 == scaledpos1

这样做:

scaledpos0 = (midpointpos*zoomscale0)+scrolloffset0; // old scale
scaledpos1 = (midpointpos*zoomscale1)+scrolloffset0; // change zoom only
scrolloffset1+=scaledpos0-scaledpos1;                  // correct offset so midpoint stays where is ... i usualy use mouse coordinate instead of midpoint so i zoom where the mouse is 

当您无法更改缩放方程时,请对您的缩放方程执行相同的操作

scaledpos0 = (midpointpos+scrolloffset0)*zoomscale0;
scaledpos1 = (midpointpos+scrolloffset0)*zoomscale1;
scrolloffset1+=(scaledpos0-scaledpos1)/zoomscale1;

希望我在那里没有犯愚蠢的错误(凭记忆写)。有关更多信息,请参阅

于 2014-01-15T09:50:30.817 回答