void MyGLWidget::keyPressEvent(QKeyEvent *event) { GLfloat cameraSpeed = 1.0f ; QVector3D cross ; bool changedFront = false ; switch ( event->key()) { case Qt::Key_W : cameraPos += cameraSpeed * cameraFront ; break ; case Qt:: Key_S : cameraPos -= cameraSpeed * cameraFront ; break ; case Qt::Key_A : cross = cross.crossProduct(cameraFront , cameraUp) ; cross.normalize(); cameraPos -= cross * cameraSpeed ; break ; case Qt::Key_D : cross = cross.crossProduct(cameraFront , cameraUp) ; cross.normalize(); cameraPos += cross * cameraSpeed ; break ; case Qt::Key_Up : pitch += 1 ; changedFront = true ; break ; case Qt::Key_Down : pitch -= 1 ; changedFront = true ; break ; case Qt::Key_Left : yaw -= 1 ; changedFront = true ; break ; case Qt::Key_Right : yaw += 1 ; changedFront = true ; break ; case Qt::Key_P : paused = !paused ; break ; case Qt::Key_R : cameraPos = QVector3D(0.0f, 0.0f, 3.0f); cameraFront = QVector3D(0.0f, 0.0f, -1.0f); cameraUp = QVector3D(0.0f, 1.0f, 0.0f); break ; default : QGLWidget::keyPressEvent(event) ; } if (changedFront) { QVector3D front; front.setX ( cos(pitch*(M_PI/180)) * cos(yaw*(M_PI/180)) ); front.setY ( sin(pitch*(M_PI/180) ) ); front.setZ ( cos(pitch*(M_PI/180)) * sin(yaw*(M_PI/180)) ); front.normalize(); cameraFront = front ; } }
graphics::Model *TerrainGenerator::simplexTerrain2(float xRange, float zRange, float vertexDensity, float octaves[], float yScales[], int nOctaves) { graphics::Model* model = new graphics::Model; graphics::ModelGroup group; cv::Mat heightMap(xRange*vertexDensity, zRange*vertexDensity, CV_32FC1); cv::Mat heightMapThresh(xRange*vertexDensity, zRange*vertexDensity, CV_32FC1); int step = heightMap.cols; qDebug() << "Number of octaves: " << nOctaves; float y = 0; // find max scale to scale correctly when saved to cv::Mat float maxScale = 0; for (int i = 0; i < nOctaves; i++){ if (yScales[i] > maxScale){ maxScale = yScales[i]; } } qDebug() << "MaxScale: " << maxScale; // Generate height map and texture coordinates for (int x = 0; x < xRange*vertexDensity; x++){ for (int z = 0; z < zRange*vertexDensity; z++){ y = 0; for(int i = 0; i < nOctaves; i++){ y += SimplexNoise1234::noise(x/octaves[i], z/octaves[i]) * yScales[i]; } group.vertices.push_back(QVector3D((float)x/vertexDensity, y, (float)z/vertexDensity)); group.texCoords.push_back(QVector3D((float)x/(xRange*vertexDensity),(float)z/(zRange*vertexDensity), 0)); heightMap.at<float>(x,z) = (y + maxScale) / (2*maxScale); } } //cv::imshow("heightMap", heightMap); cv::threshold(heightMap, heightMapThresh, 0.5, 1, 1); //cv::imshow("heightMapThresh", heightMapThresh); qDebug() << "step: " << step; // Tie vertices together. openGL indexing starts at 0 tydligen.. for (int x = 1; x < xRange*vertexDensity; x++){ for (int z = 1; z < zRange*vertexDensity; z++){ // First triangle group.indices.push_back( (x-1)*step + z-1); // 0 group.indices.push_back( x*step + z ); // 3 group.indices.push_back( x*step + z-1); // 2 // Second triangle group.indices.push_back( (x-1)*step + z-1); // 0 group.indices.push_back( (x-1)*step + z ); // 1 group.indices.push_back( x*step + z ); // 3 } } float y00, y01, y10; QVector3D tangent1, tangent2; QVector3D normal; // Calculate normals for (int z = 0; z < zRange*vertexDensity; z++){ group.normals.push_back(QVector3D(0,1,0)); } for (int x = 1; x < xRange*vertexDensity; x++){ group.normals.push_back(QVector3D(0,1,0)); for (int z = 1; z < zRange*vertexDensity; z++){ y00 = heightMap.at<float>(x-1,z-1); y01 = heightMap.at<float>(x-1,z); y10 = heightMap.at<float>(x,z-1); tangent1 = QVector3D(1, y10-y00, 0); tangent2 = QVector3D(0, y01-y00, 1); normal = normal.crossProduct(tangent2, tangent1); normal.normalize(); group.normals.push_back(normal); } } model->groups.push_back(group); model->uploadToGPU(); return model; }