<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
</Grid>
Nossa estrutura do layout já está pronta! Agora vamos incluir os componentes
para exibir as informações. Um componente simples e útil para exibir informações é o campo Label. Teremos 6 campos deste tipo e iremos definir algumas propriedades visuais para eles. Os três primeiros campos devem receber os valores X, Y
20
Casa do Código
Capítulo 3. Acelerômetro e Eixo Motorizado
e Z na propriedade Content e os três últimos campos devem receber os valores
labelX, labelY e labelZ na propriedade Name para que eles se tornem acessíveis no codebehind de nossa janela. Precisamos disso porque vamos atualizar o valor da propriedade Content com o valor do acelerômetro em nosso código C#, além disso, é
importante utilizar as propriedades de alinhamento e as propriedades herdadas do componente Grid para posicionar a informação adequadamente no nosso layout.
Com tudo terminado, o código desta janela deve ficar semelhante ao código a seguir.
<Window x:Class="Acelerometro.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="150" Width="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Content="X" HorizontalAlignment="Center"
FontSize="24" VerticalAlignment="Center" />
<Label Content="Y" HorizontalAlignment="Center"
FontSize="24" VerticalAlignment="Center"
Grid.Row="1"/>
<Label Content="Z" HorizontalAlignment="Center"
FontSize="24"
VerticalAlignment="Center"
Grid.Row="2"/>
<Label Name="labelX" HorizontalAlignment="Left"
FontSize="24" VerticalAlignment="Center"
Margin="10,0" Grid.Column="1"
/>
<Label Name="labelY" HorizontalAlignment="Left"
FontSize="24" VerticalAlignment="Center"
Margin="10,0" Grid.Column="1" Grid.Row="1"/>
21
3.1. Acelerômetro
Casa do Código
<Label Name="labelZ" HorizontalAlignment="Left"
FontSize="24" VerticalAlignment="Center"
Margin="10,0" Grid.Column="1" Grid.Row="2"/>
</Grid>
</Window>
Agora nossa janela já está pronta. Podemos implementar o código que irá atu-
alizar estes campos com os valores do acelerômetro do sensor. Para fazer isso criaremos um método chamado AtualizarValoresAcelerometro(), no qual ire-
mos obter os valores através do método disponível na SDK e inseri-los na propriedade Content dos componentes labelX, labelY e labelZ, conforme o código a seguir.
private void AtualizarValoresAcelerometro()
{
Vector4 resultado = kinect.AccelerometerGetCurrentReading();
labelX.Content = Math.Round(resultado.X, 3);
labelY.Content = Math.Round(resultado.Y, 3);
labelZ.Content = Math.Round(resultado.Z, 3);
}
Esta é a forma de obter os valores do acelerômetro, bem simples não é? Agora temos que observar um ponto importante, quando este método será executado? Con-
forme dito anteriormente não há eventos para a atualização do acelerômetro, pois ele sofre variações constantemente, para atualizarmos o valor iremos criar nosso próprio timer.
O objeto DispatcherTimer funciona como um cronômetro: cada vez que o
tempo definido como seu intervalo passa, o evento Tick é chamado. Vamos inter-
pretar este evento e dentro dele chamaremos o método criado anteriormente. Para criar um timer em C# basta utilizar o objeto mencionado, preencher a propriedade Interval que irá definir o intervalo com que o evento Tick é chamado e invocar
o método Start para que o timer inicie. Veja como o método de inicialização do
timer e o método que interpreta o evento Tick ficaram simples.
private void InicializarTimer()
{
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(100);
timer.Tick += timer_Tick;
timer.Start();
22
Casa do Código
Capítulo 3. Acelerômetro e Eixo Motorizado
}
private void timer_Tick(object sender, EventArgs e)
{
AtualizarValoresAcelerometro();
}
Agora basta que o construtor de nossa janela invoque os métodos para inicializar o sensor Kinect e o timer que tudo irá funcionar. Execute sua aplicação e veja os valores do acelerômetro sendo alterados conforme você mexe no sensor. A figura 3.1
ilustra a janela da nossa aplicação.
Figura 3.1: Aplicação Acelerômetro
3.2
Eixo Motorizado
O Eixo motorizado é uma peça importante no Kinect, através dele é possível alterar o ângulo de elevação do componente onde ficam as câmeras do sensor, alterando assim a visão que o sensor possui do ambiente. Este eixo movimenta o sensor apenas para cima e para baixo, atualmente não há uma forma de movimentá-lo horizontalmente.
O Kinect possui um raio de visão de 57.5 graus na horizontal e 43.5 graus na vertical, contudo este eixo motorizado pode movimentar a visão vertical para 27 graus para cima ou para baixo, conforme ilustrado na figura 3.2.