Я хочу попросить вас, ребята, помочь мне с созданием ключевых кадров в Max SDK C ++.
Что я сделал:
getValue
Функция Я сделал свои переводы с помощью кода.setValue
функция.Который, я думаю, управляет ключевыми кадрами и сохраняет положение контроллеров в заданное время в данном ключевом кадре. Таким образом, я смог настроить клавиши вручную, но мне бы очень хотелось работать с Auto Key, включенной в Max.
С другой стороны, я не вижу недавно добавленные значения ключей. Поэтому, пожалуйста, помогите мне, как я могу добавить ключевые кадры?
Большое спасибо:
Бандерас
void maxProject3::GetValue(TimeValue t, void *ptr, Interval &valid, GetSetMethod method)
{
Point3 p3OurAbsValue(0, 0, 0);
tomb[0]=0;
//These positions stores my data they are globals
XPosition += (accX);
YPosition += (accY);
ZPosition += (accZ);
p3OurAbsValue.x = XPosition;
p3OurAbsValue.y = YPosition;
p3OurAbsValue.z = ZPosition;
valid.Set(t,t+1); //This answer is only valid at the calling time.
MatrixCtrl->GetValue(t, &p3OurAbsValue.y, valid, CTRL_RELATIVE);
if (method == CTRL_ABSOLUTE)
{
Point3* p3InVal = (Point3*)ptr;
*p3InVal = p3OurAbsValue;
}
else // CTRL_RELATIVE
{
//We do our translations on a Matrix
Matrix3* m3InVal = (Matrix3*)ptr;
//m3InVal->PreTranslate(p3OurAbsValue);
m3InVal->PreRotateX(rotX);
m3InVal->PreRotateY(rotY);
m3InVal->PreRotateZ(rotZ);
}
}
int maxProject3::NumSubs() {
return 1;
}
Animatable* maxProject3::SubAnim(int n) {
return MatrixCtrl;
}
void maxProject3::SetValue(TimeValue t, void *ptr, int commit, GetSetMethod method)
{
Matrix3* m3InVal = (Matrix3*)ptr;
MatrixCtrl->AddNewKey(t, ADDKEY_SELECT);
MatrixCtrl->SetValue(t, &m3InVal, commit, CTRL_RELATIVE);
}
Чтобы включить режим Auto key, попробуйте использовать AnimateOn()
до вашей трансформации. Также добавьте AnimateOff()
отключить режим автоматического ключа в конце.
Я сделал это в одном из моих проектов, чтобы создать анимацию идентификатора материала, используя режим автоключей.
/** Auto key on*/
AnimateOn();
/** Creating material id animation */
for(int mtl_id = 1; mtl_id <= num_sub_mtl; ++mtl_id, time += time_step)
{
mtl_modifier->GetParamBlock()->SetValue(MATMOD_MATID,time,mtl_id);
}
/** Auto key off*/
AnimateOff();
Также в качестве предложения используйте слушатель скрипта max, чтобы узнать, что происходит, когда анимация создается с использованием 3ds Max GUI. Это поможет вам воссоздать анимацию с помощью Max SDK.