本文整理汇总了C++中QVector3D::crossProduct方法的典型用法代码示例。如果您正苦于以下问题:C++ QVector3D::crossProduct方法的具体用法?C++ QVector3D::crossProduct怎么用?C++ QVector3D::crossProduct使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类QVector3D
的用法示例。
在下文中一共展示了QVector3D::crossProduct方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: keyPressEvent
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 ;
}
}
示例2: heightMap
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;
}