设置图像旋转角度为0度HTML,对象不沿其所面向的方向移动,除非旋转角度为0或180度...

如标题所示,当面对任何非0或180度的方向时,对象无法正确移动。这是在3D空间中,但旋转仅在1轴(UP)上,因此对象左右旋转。 下面是一个用于帮助可视化问题的绘图:http://dl.dropbox.com/u/60309894/rotationissue.png 按住鼠标右键时,对象将根据鼠标的三角洲位置旋转。 下面是代码:对象不沿其所面向的方向移动,除非旋转角度为0或180度

// Check & calculate rotation.

if (mouse->ButtonIsDown(NiInputMouse::NIM_RIGHT))

{

int iDeltaX = 0, iDeltaY = 0, iDeltaZ = 0;

mouse->GetPositionDelta(iDeltaX,iDeltaY,iDeltaZ);

if (iDeltaX != 0)

{

NiMatrix3 mMat;

mMat.MakeRotation(iDeltaX/100.0f,NiPoint3::UNIT_Z);

SetRotate( GetRotate() * mMat );

}

}

// Check & calculate movement.

m_vVelocity = NiPoint3::ZERO;

if (keyboard->KeyIsDown(NiInputKeyboard::KEY_W) == true)

m_vVelocity.y++;

if (keyboard->KeyIsDown(NiInputKeyboard::KEY_S) == true)

m_vVelocity.y-- ;

if (keyboard->KeyIsDown(NiInputKeyboard::KEY_A) == true)

m_vVelocity.x--;

if (keyboard->KeyIsDown(NiInputKeyboard::KEY_D) == true)

m_vVelocity.x++;

m_vVelocity.Unitize();

// Move the object.

m_spNode->SetTranslate(GetTranslate() + m_vVelocity * GetRotate() * m_fSpeed * dt);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中使用setTargetRotation方法设置预览图像的旋转角度时,可能会出现预览图像放大的问题,这通常是由于摄像头驱动程序的实现不够完善所引起的。原因是在部分机型上,摄像头的预览图像并不是直接输出的,而是经过了一个缓冲区的处理,当使用setTargetRotation方法设置旋转角度时,缓冲区中的图像会被拉伸或压缩,导致出现预览图像放大的问题。 为了解决这个问题,我们可以使用Matrix类对预览图像进行旋转和缩放操作,而不是使用setTargetRotation方法。具体来说,我们可以在SurfaceTextureListener的onSurfaceTextureAvailable()方法中获取到SurfaceTexture对象,并使用这个对象创建一个Surface对象,然后在Camera的setPreviewTexture()方法中设置这个Surface对象,这样就可以使用SurfaceTexture和Camera之间的缓冲区直接显示预览图像,而不会出现放大的问题。 以下是一个简单的代码示例,演示了如何使用Matrix类进行旋转和缩放操作: ```java Matrix matrix = new Matrix(); // 旋转90 matrix.setRotate(90); // 缩放2倍 matrix.setScale(2, 2); Camera camera = Camera.open(); Camera.Parameters parameters = camera.getParameters(); parameters.setRotation(90); camera.setParameters(parameters); camera.setDisplayOrientation(90); try { camera.setPreviewTexture(surfaceTexture); } catch (IOException e) { e.printStackTrace(); } camera.startPreview(); // 获取预览图像 byte[] buffer = new byte[previewSize.width * previewSize.height * 3 / 2]; camera.addCallbackBuffer(buffer); camera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { // 将预览图像旋转和缩放后显示在SurfaceTexture上 YuvImage yuvImage = new YuvImage(data, ImageFormat.NV21, previewSize.width, previewSize.height, null); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); yuvImage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 100, outputStream); Bitmap bitmap = BitmapFactory.decodeByteArray(outputStream.toByteArray(), 0, outputStream.size()); Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); Surface surface = new Surface(surfaceTexture); Canvas canvas = surface.lockCanvas(null); canvas.drawBitmap(rotatedBitmap, 0, 0, null); surface.unlockCanvasAndPost(canvas); surface.release(); camera.addCallbackBuffer(data); } }); ``` 在这个示例中,我们首先创建了一个Matrix对象,并使用setRotate()和setScale()方法对其进行了旋转和缩放操作,然后使用Camera对象获取了摄像头的参数,并使用setParameters()方法设置了摄像头的旋转角度和显示方向。接着,我们使用Camera的setPreviewTexture()方法将SurfaceTexture对象设置为预览图像的目标,然后使用Camera的startPreview()方法开始预览。 在获取预览图像时,我们使用Camera的addCallbackBuffer()方法设置了一个预览图像的缓冲区,并使用setPreviewCallbackWithBuffer()方法设置了一个回调函数,当有新的预览图像时,就会调用这个回调函数。在回调函数中,我们将预览图像转换为Bitmap对象,并使用createBitmap()方法对其进行旋转和缩放操作,最后将旋转和缩放后的Bitmap对象通过Canvas对象显示在SurfaceTexture上。 需要注意的是,在每次回调函数中需要使用Camera的addCallbackBuffer()方法重新设置预览图像的缓冲区,否则会导致出现预览图像异常的问题。此外,在使用Surface对象时,需要在显示完毕后调用unlockCanvasAndPost()方法释放Surface对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值