Как программировать плавный поворот модели
Однако, процесс этот, хоть и удобный, но не очень равномерный, кроме того иногда хочется, чтобы модель не меняла свой размер, а только очень-очень плавно поворачивалась в нужном направлении.
Запускать плавный поворот в нужную сторону было бы удобно, нажимая клавиши < и > на клавиатуре компьютера. А останавливать вращение можно было бы, нажимая любую из этих клавиш.
Некую сложность в программировании таких действий составляет то, что Визуал Бейсик не поддерживает рекурсию. То есть, к одной и той же подпрограмме невозможно обратиться напрямую – нажимая клавишу, с тем, чтобы она сначала начала цикл поворотов, а при повторном нажатии остановилась.
Поэтому пришлось использовать флаг FT – целочисленную переменную, обрывающую счёт.
Режим плавного поворота задаётся флагом Ftim. Он устанавливается в единицу при клике по кнопке <cls>, этот же клик стирает ненужную при плавном повороте метку. Цифра на кнопке «Плотность» (переменная CV) задаёт шаг поворота и тем самым регулирует скорость вращения.
В приведённом ниже тексте используется ещё один флаг - FTa. Этот флаг используется для организации плавного вращения модели вокруг произвольно выбранного отрезка.
Посмотреть клип с плавными поворотами вокруг вертикальной оси и вокруг выбранного отрезка можно тут - (клип делается, но пока не готов)
__________
Public Sub Vtim(M As Integer) 'плавный поворот модели <188 >190
Dim dU As Single
If Ftim = 0 Then Exit Sub
If Ftim = 1 Then Ftim = 2: Utim = 0:
FT = 1
dU = (CV + 1) / 8: dU = dU * (189 - M): Maa = 1:
If Form1.Command64.Caption = 8 Then Call SNggT(56, 56):
5 If FTa = 1 Then Call Act10(1): GoTo 7:
If Form1.Command64.Caption = 8 Then Call Act10(1): GoTo 6:
Utim = Utim + dU: If Utim > 90 And dU > 0 Then FT = 0: Exit Sub
If Utim < -90 And dU < 0 Then FT = 0: Exit Sub
Saa = Sin(Utim * pi180): Caa = Cos(Utim * pi180)
6 Form1.Picture1.Line (1, 1)-(Kw, Kh), C240, BF: Call VPrun(2)
7 DoEvents: Sleep 50:
If FT = 2 Then FT = 3: Exit Sub
GoTo 5:
End Sub
'=====================================
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 'горячие клавиши
Dim K As Integer, K1 As Integer
K = KeyCode
If FT = 1 And (K = 188 Or K = 190) Then FT = 2: Exit Sub:
End Sub
'=====================================
Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) 'горячие клавиши
Dim K As Integer, K1 As Integer
Static FTo As Integer
K = KeyCode
If FTo = 2 Then FTo = 0: FT = 0:
If FT = 1 And (K = 188 Or K = 190) Then FT = 2: FTo = 2: Exit Sub:
If Ftim > 0 And (K = 188 Or K = 190) Then Call Vtim(K): Text2 = " стоп": Exit Sub:
…
Оператор DoEvents разрешает прерывания, после чего нужна пауза, чтобы программа успела закончить свои текущие дела.
А чтобы работала пауза, в начале блока делается такая надпись -
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Свидетельство о публикации №222081400329