gpt4 book ai didi

ios - OpenGL ES 对象绕 Z 轴旋转

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:22:11 27 4
gpt4 key购买 nike

我的屏幕上有一个旋转和平移的对象,但我有 2 个关于 z 轴旋转的问题。解释起来有点棘手,所以我上传了 2 个视频来描述每个问题。

1) Reverse rotation : 在围绕 x 轴旋转对象后,z 轴旋转被反转,这是应该的。

2) Wrong Z axis rotation : 同样,在绕 x 轴旋转对象后,我试图绕 z 轴旋转对象,并且旋转导致不同的轴旋转。

我相信视频很好地描述了问题。

编辑:更新#1

好吧,我以为我找到了解决方案,它只围绕 Z 轴旋转相机,并对模型本身执行 X 和 Y 旋转。这似乎很好,但当然会导致此 VIDEO 中描述的新问题(这是在第 23 秒,剩下的就是展示它是如何完成的)。

发生这种情况的原因是对象的轴系统正在旋转,当我进行 Z 轴旋转然后进行 X 或 Y 轴旋转时,结果是错误的。

我只是不知道如何单独从轴系统旋转对象,以便正确完成旋转。

现在,对于代码部分:

渲染函数:

- (void)render:(CADisplayLink*)displayLink {
...

CC3GLMatrix *projection = [CC3GLMatrix matrix];
float h = 4.0f * self.frame.size.height / self.frame.size.width;
[projection populateFromFrustumLeft:-2 andRight:2 andBottom:-h/2 andTop:h/2 andNear:4 andFar:100];
glUniformMatrix4fv(_projectionUniform, 1, 0, projection.glMatrix);

[modelView populateFromTranslation:_currentPan];
[modelView rotateBy:_currentRotation];
[modelView rotateByZ:zRotationEnd];

glUniformMatrix4fv(_modelViewUniform, 1, 0, modelView.glMatrix);
...
}

X 和 Y 旋转:

- (void) rotateAroundX:(float) x andY:(float) y newRotate:(BOOL) isNewRotate
{
if (isNewRotate) {
rotationStart = CC3VectorMake(0.0, 0.0, 0.0);
}

int rotationDirection = ceil(zRotationEnd/90);
if (rotationDirection % 4 == 2 || rotationDirection % 4 == 3) {
rotationEnd.x = rotationEnd.x - (x-rotationStart.x);
rotationEnd.y = rotationEnd.y - (y-rotationStart.y);
} else {
rotationEnd.x = rotationEnd.x + (x-rotationStart.x);
rotationEnd.y = rotationEnd.y + (y-rotationStart.y);
}

rotationStart.x = x;
rotationStart.y = y;

_currentRotation = CC3VectorMake(rotationEnd.y, rotationEnd.x, 0);
NSLog(@"Current x is: %f y is: %f z is: %f",_currentRotation.x,_currentRotation.y,zRotationEnd);
}

以及相关的调用部分:

if(sender.numberOfTouches == 1)
{
BOOL started = false;
CGPoint rotation = [sender translationInView:sender.view];
float x = rotation.x;
float y = rotation.y;
if (sender.state == UIGestureRecognizerStateBegan)
{
started = true;
}
[self.glView rotateAroundX:x andY:y newRotate:started];
}

Z轴旋转函数:

- (void) rotateAroundZ:(float) z newRotate:(BOOL) isNewRotate
{
if (isNewRotate) {
zRotationStart = 0;
}
zRotationEnd = zRotationEnd - (z - zRotationStart);
zRotationStart = z;
}

以及相关的调用部分:

- (IBAction)rotation:(UIRotationGestureRecognizer *)sender {
BOOL started = false;
float rotation = RadiansToDegrees([sender rotation]);
if (sender.state == UIGestureRecognizerStateBegan)
{
started = true;
}
[self.glView rotateAroundZ:rotation newRotate:started];
NSLog(@"Rotation %f", rotation);
}

着色器:

attribute vec4 Position;
attribute vec4 SourceColor;

varying vec4 DestinationColor;

uniform mat4 Projection;
uniform mat4 Modelview;

attribute vec2 TexCoordIn;
varying vec2 TexCoordOut;

void main(void) {
DestinationColor = SourceColor;
gl_Position = Projection * Modelview * Position;
TexCoordOut = TexCoordIn;
}

非常感谢任何帮助。

干杯!

最佳答案

简单的旋转。

这是根据触摸移动旋转对象的最简单方法。这是例子

pseudocode:

Matrix.setIdentity(modelMatrix);

... do other translations here ...

Matrix.rotateX(totalYMovement);
Matrix.rotateY(totalXMovement);

这是每一帧完成的。

要向上或向下旋转对象,我们将其围绕 X 轴旋转,而要向左或向右旋转对象,我们将其围绕 Y 轴旋转。如果我们想让它旋转,我们也可以围绕 Z 轴旋转对象。

Here's a tutorial

关于ios - OpenGL ES 对象绕 Z 轴旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22183767/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com