Ir ao conteúdo
  • Cadastre-se

C C : como rodar 1 ponto no seu centro?


Cambalinho

Posts recomendados

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!