Ir ao conteúdo

Posts recomendados

Postado

imagine que temos 1 rectangulo com:

x=10

Y= 20

Z = 0

comprimento = 10

altura = 10

 

para rodar o rectangulo temos de rodar os 4 vertices:

X = (Position.Z) * Sin(RotationInRads.Y) + (Position.X ) * Cos(RotationInRads.Y)

Y = (Position.Y) * Cos(RotationInRads.X) - (Position.Z ) * Sin(RotationInRads.X)

Z = (Position.Y) * Sin(RotationInRads.X) + (Position.Z ) * Cos(RotationInRads.X)

 

pelo que aprendi eu tenho de adicionar o centro do rectangulo ás posições:

X = (Position.Z+ ZDepth/2) * Sin(RotationInRads.Y) + (Position.X+Width/2 ) * Cos(RotationInRads.Y)

Y = (Position.Y+Height/2) * Cos(RotationInRads.X) - (Position.Z+ ZDepth/2 ) * Sin(RotationInRads.X)

Z = (Position.Y+Height/2) * Sin(RotationInRads.X) + (Position.Z+Height/2 ) * Cos(RotationInRads.X)

 

mas o problema é que a rotação ainda é feita em torno de circulo e não na mesma posição

o que estou a fazer mal nos calculos?

  • Curtir 2
Postado

isso poderia ser 1 codigo, mas eu demonstro como pseucodigo para outros entenderem... e não uso 1 libraria...
eu consigo rodar agora(vou mostrar codigo VB6):
 

Private Function Rotate(Position As Position3D, Rotation As Angle3D, PositionRotated As Position3D) As Position3D
    Dim ConvertedPosition As Position3D
    Dim RotationInRads As Angle3D
    
    RotationInRads = ConvertDegreesToRadians(Rotation)
    ConvertedPosition = Position
    
    If (Rotation.X <> 0) Then
        ConvertedPosition.Y = (Position.Y - PositionRotated.Y) * Cos(RotationInRads.X) - (Position.Z - PositionRotated.Z) * Sin(RotationInRads.X)
        ConvertedPosition.Z = (Position.Y - PositionRotated.Y) * Sin(RotationInRads.X) + (Position.Z - PositionRotated.Z) * Cos(RotationInRads.X)
    End If
    
    If (Rotation.Y <> 0) Then
        ConvertedPosition.X = (Position.Z - PositionRotated.Z) * Sin(RotationInRads.Y) + (Position.Z - PositionRotated.Z) * Cos(RotationInRads.Y)
        ConvertedPosition.Z = (Position.Z - PositionRotated.Z) * Cos(RotationInRads.Y) - (Position.Z - PositionRotated.Z) * Sin(RotationInRads.Y)
    End If
    
    
    If (Rotation.Z <> 0) Then
        ConvertedPosition.X = (Position.X - PositionRotated.X) * Cos(RotationInRads.Z) - (Position.Y - PositionRotated.Y) * Sin(RotationInRads.Z)
        ConvertedPosition.Y = (Position.X - PositionRotated.X) * Sin(RotationInRads.Z) + (Position.Y - PositionRotated.Y) * Cos(RotationInRads.Z)
    End If
    
    
    ConvertedPosition.X = ConvertedPosition.X + Position.X
    ConvertedPosition.Y = ConvertedPosition.Y + Position.Y
    ConvertedPosition.Z = ConvertedPosition.Z + Position.Z
    Rotate = ConvertedPosition
End Function


'...........
Private Sub FillPosition3D(Position As Position3D, X As Long, Y As Long, Z As Long)
    Position.X = X
    Position.Y = Y
    Position.Z = Z
End Sub
'............
FillPosition3D RotatedPosition, Position.X + Size.Width / 2, Position.Y + Size.Height / 2, Position.Z + Size.ZDepth / 2

mas agora noto alguns problemas:
1 - a rotação Z funciona correctamente, mas altera a escala do rectangulo;

2 - o X, Y fazem rotação sem o centro :(

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...