У меня есть C++ объект, который я получаю ссылку на на мой взгляд контроллера, как это:Вызов класса C++ внутри контроллера вида аварий
m_applicationEngine = (ApplicationEngine *)[(GLView *)[self.parentViewController view] m_applicationEngine];
В моем месте делегатом я называю methid в класс как это:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
CLLocationCoordinate2D coordinate = [newLocation coordinate];
NSLog(@"Location acquired %f, %f", coordinate.latitude, coordinate.longitude);
myLocation = new Location(coordinate.latitude, coordinate.longitude);
m_applicationEngine->GotoLoc(myLocation);
}
это вызов функции GotoLoc, но он выходит из строя в первый раз функция обращается публичным переменный экземпляр m_applicationEngine. Я уверен, что член уже инициализирован. У кого-нибудь есть идеи?
m_applicationEngine - объект C++, инициализированный в initWithFrame() в GLView: UIView.
m_applicationEngine = new ApplicationEngine(m_renderingEngine, self);
Адрес: GotoLoc(). В первый раз он ссылается на m_rotation, который является переменной-членом класса, который он выдает. Я могу вызвать GotoLoc() в других областях кода, просто не в вышеупомянутой функции делегата Obj-C.
void ApplicationEngine::GotoLoc(Location *location) {
vec3 eye = vec3(0, 0, 1);
vec3 end = location->loc;
// Compute the difference between where we're looking at now vs. where we want to point
mat4 transpose;
MatrixTranspose(transpose, m_rotation);
MatrixVec3Multiply(eye, eye, transpose);
//cout << "Inverse. I was here x:" << relativeVec.x << " y:" << relativeVec.y << " z:" << relativeVec.z << endl;
// bring vectors down to the equator to measure x angle
vec3 relativeX = vec3(eye.x, 0, eye.z);
// reference vector is the rotation axis for the sign to be correct
float xAngle = signed_angle(relativeX, vec3(end.x, 0, end.z), vec3(0,-1,0));
mat4 rotationX;
MatrixRotationY(rotationX, -1 * xAngle);
MatrixMultiply(m_rotation, rotationX, m_rotation);
// need to rotate eye vector to line up on y with new target to measure y angle
MatrixTranspose(transpose, rotationX);
MatrixVec3Multiply(eye, eye, transpose);
float yAngle = signed_angle(eye, end, vec3(1,0,0));
cout << "Went to difference of: ANGLE x: " << RADIANS_TO_DEGREES(xAngle) << " y:" << RADIANS_TO_DEGREES(yAngle) << endl;
mat4 rotationY;
MatrixRotationX(rotationY, -1 * yAngle);
MatrixMultiply(m_rotation, m_rotation, rotationY);
}
Что такое код для местоположения и m_applicationEngine – Mark